LeetCode 题解1 (Python)

本文转载自作业部落chanvee.

前几天听一位好哥们介绍了LeetCode,据说很多公司的面试题目都是从这里参考而来,于是也开始跟风来刷一下这里的题目。LeeTCode是支持python的,而我也不会python,于是想着通过刷题来顺带来学习一下python这门现在很火的语言,于是这周边看边刷,做了10道水题,作为题解以备不时之需。

Reverse Words in a String


这个题的意思是,给定一个字符串,字符串是以单词的形式拼接起来的,需要做的就是把字符串里面的单词逆序输出,但是单词内的顺序是不变的,相信看它的例子大家都能明白。这个题目用python里面的列表的话就非常简单,首先将字符串按“ ”分割,然后去掉分割出来的列表中空格(因为两个单词间可能有多个空格,这是这个题目的陷阱),最后列表倒序再以空格拼接成字符串输出即可。代码如下:

class Solution:
    # @param s, a string
    # @return a string
    def reverseWords(self, s):
        tmp = s.split(' ') # 将字符串分割为列表
        while '' in tmp:   # 清除空元素
            tmp.remove('')
        tmp.reverse()      # 列表倒序
        tmp = ' '.join(tmp) #列表转化为字符串,并以空格连接
        return(tmp)

Single Number


这个题和下一个题都很有技巧,这个题的意思是给定一个序列,这个序列中的数除了有一个数只出现过一次外,其他的数都出现两次,请找出这个只出现一次的数。最直观的想法就是遍历一遍把每个数出现的次数都存起来,然后再看谁的次数为1。但是网上有一种更加简洁而巧妙地方法,用异或来解决这个问题,他的思想是两个相同的数异或为0,0和任何数异或为任何数,这样只需要把整个序列全都异或一遍,最后得到的数就是想要的答案了。代码如下:

class Solution:
    # @param A, a list of integer
    # @return an integer
    def singleNumber(self, A):
        result = 0
        for i in A:
        # 相同元素异或为0,0与任何数异或等于任何数,有a^b^a = b
        # 此外,异或还可以用于两个元素交换a=a^b^(b=a)
            result = result^i   
        return(result)

Single Number II


这个题更加巧妙,题目与上一个题目类似,不过这一次序列中的数字除了某一个数字外都出现3次,需要找出这个数字,先贴代码再解释。

class Solution:
    # @param A, a list of integer
    # @return an integer
    def singleNumber(self, A):
        ones, twos = 0, 0
        for ele in A: 
            ones = ones^ele & ~twos 
            twos = twos^ele & ~ones
        return(ones)

当元素ele第一出现时,ones,twos = ele,0;当其第二次出现时,ones,twos = 0,ele;当其第三次出现时ones,twos都变为0,就相当于这个数字没有出现过,这样最后的结果就是ones了。于是,根据这个题我们可以推广到,有这样一个序列,序列中所有的数字都出现m次,只有一个数字出现n次(m>n),请找出这个只出现n次的数字,代码如下:

def singleNumber(A,m,n):
        tmp = [0]*(m-1)
        for ele in A: 
            for i in range(m-1):
                tmp[i] = tmp[i]^ele
                for j in range(m-1):
                    if i != j:
                        tmp[i] = tmp[i] & ~tmp[j]
        return(tmp[n-1])

Valid Palindrome


这个题是判断一个字符串是否是回文,回文的意思是正序和逆序都一样,所以这也成了我们判断的标准,这个题的回文是不区分大小写的,因此首先可以将所有字母转为小(大)写,需要注意的是它这里只关注字母和数字,因此其他的符号需要去掉,需要用到了python的正则表达式。代码如下:

import re # 正则表达式包含在re里面
class Solution:
    # @param s, a string
    # @return a boolean
    def isPalindrome(self, s):
        s = s.lower() # 首先将字符串转为小写
        s = re.sub('[^A-Za-z0-9]','',s) # 正则表达式去除非字母和数字的符号
        if s == s[::-1]: # 如果是回文,即正序和逆序一样
            return(True)
        else:
            return(False)

Merge Sorted Array


这个题目的意思是把两个排好序的序列合并为一个排好序的序列,本来我最开始想的是直接把两个序列拼接在一起,然后用python列表里面自带的sort函数排个序就Ok了,但是这样做的复杂度至少是O((m+n)log(m+n))的,另外一种O(m+n)做法是从后面往前面排,比如合并后的最后一个数A[m+n-1]就应该等于A[m-1]和B[n-1]中较大的一个以此类推,这样可以避免从前往后需要移动的操作,需要注意的特列就是A和B中某一个为空。代码如下:

class Solution:
    # @param A  a list of integers
    # @param m  an integer, length of A
    # @param B  a list of integers
    # @param n  an integer, length of B
    # @return nothing
    def merge(self, A, m, B, n):
        for i in range(m+n-1, -1, -1): 
            if m == 0 or (n > 0 and B[n-1] > A[m-1]): # 判断A、B是否为空
                A[i] = B[n-1]
                n -= 1
            else:
                A[i] = A[m-1]
                m -= 1
        return(A)

Climbing Stairs


这其实是一道组合数学的题目,总共有n步台阶,每次只能走一步或者两步,总共有多少种走法。这个问题可以这样思考:假设已知有n步台阶共有f(n)种走法,对于n+1步台阶由两部分组成:一个是前面n步台阶的f(n)种走法后直接一步到达n+1;另一种是前面n-1步台阶的f(n-1)种走法后走两步到达n+1。因此可以得到递推关系是:f(n+1) = f(n) + f(n-1)。代码如下:

class Solution:
    # @param n, an integer
    # @return an integer
    def climbStairs(self, n):
        f = [1, 2]
        for i in range(2,n):  
            f.append(f[i-2] + f[i-1])
        return(f[n-1])

Plus One


这个题就是实现大数(用数组存储)加1的功能。需要注意的就是满十进一这个规则,以及类似999+1=1000需要在第一位添一个1这种特例。代码如下:

class Solution:
    # @param digits, a list of integer digits
    # @return a list of integer digits
    def plusOne(self, digits):
        flag = 1
        for i in range(len(digits)-1, -1, -1):
            digits[i] = (digits[i] + 1) % 10 # 加1模10,如果没有进位则跳出循环,否则高一位加1
            if digits[i]:
                flag = 0
                break 
        if flag: # 如果每一位都进位了,则在数组第一位添加1
            digits.insert(0,1)
        return(digits)

Remove Element


这个题目的意思是去掉序列中规定的元素之后求剩下的序列的长度,非常简单,代码如下:

class Solution:
    # @param    A       a list of integers
    # @param    elem    an integer, value need to be removed
    # @return an integer
    def removeElement(self, A, elem):
        while elem in A:
            A.remove(elem)
        return(len(A))

Reverse Integer


这个题是将一个整数逆序输出,当然如果是负数,符号不需要逆序。做法就是将其转化为字符串,然后逆序即可。需要注意的陷阱就是当你逆序之后,该数可能超出了最大值2^31 - 1,需要做判断。

class Solution:
    # @return an integer
    def reverse(self, x):
        if x >=0:
        x = '%d' %x  # Convert to string
        if int(x[::-1]) > (2 ** 31-1):
            return 0;
        else:
            return(int(x[::-1])) # reverse
    else:
        x = abs(x)
        x = '%d' %x   
        if int("-" + x[::-1]) < -2 ** 31:
            return 0
        else:
            return(int("-" + x[::-1]))

Two Sum


需找出一个列表中是否有两个数的和为一个给定的数,并返回这两个数的下标。需要用到python里面的字典(相当于hash表),判断第i个数前面是否有一个数的值为target - num[i]。代码如下:

class Solution:
    # @return a tuple, (index1, index2)
    def twoSum(self, num, target):
        tmp = {}
        for i in range(len(num)):
            if target - num[i] in tmp:
                return(tmp[target - num[i]] +1, i + 1)
            else:
                tmp[num[i]] = i;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容