leetcode刷题日记(一)

leetcode题库和测试平台中文版:https://leetcode-cn.com/problemset/all/
也不知道是不是我网速的问题,想测试程序,很多时间都浪费在打不开网页,待审状态。。。以下题目自己随机挑选,自己瞎琢磨,有比较繁琐的地方还请大家指正,不定时更新,希望早日刷完题库,拿到offer。

两数之和

这个问题当然可以用简单的嵌套循环做,但是你会发现,速度很慢,怎么提高速度呢,当然是减少遍历次数,解决方案中我最纠结的点有两个:

  1. 如果输入的是[3,3],怎么返回第二个3的index,也就是一个列表中如果有重复的元素,如何才能返回所有的index,有两种方法,第一种是用enumerate函数,可以把list变成一个tuple,里面包含有index的位置和数值。第二种方法是偷梁换柱,比如将第一个3换成一个字符串,再去寻找3的index,返回的只能是1,不可能是0。
  2. 如果target是一个偶数比如8,列表是[1,3,4],那结果会不会返回[2, 2],显然这个结果是错误的,怎么解决呢,还是偷梁换柱或者避免重复搜索同一个位置。

以下两种方法是自己琢磨的,虽然速度不算最快,起码通过了leetcode,代码如下

# 解法一:偷梁换柱
def twoSum(self, nums, target):
    for ii in range(len(nums)):
        yy = target-nums[ii]
        if (yy in nums) and (nums[ii] != yy):
            return sorted([ii,nums.index(yy)])
        elif (yy in nums) and (nums[ii] == yy):
            nums[ii] = "aa"
            if (yy in nums):
                return sorted([ii,nums.index(yy)])  
                
# 解法二:enumerate
def twoSum(self, nums, target):
    lis = []
    for index, value in enumerate(nums):
        if value == target -value:
            lis.append(index)
            if len(lis) == 2:
                return lis[:2] 
                break
        else:
            if (target-value) in nums:
                return sorted([index, nums.index(target-value)])
                break

求众数

这个比较简单,但是如果简单遍历整个列表,就会很慢,于是我先把列表去重(用set),再进行遍历,速度快了很多。

def majorityElement(self, nums):
    set_test = set(nums)
    for num in set_test:
        aa = nums.count(num)
        if aa > len(nums)//2:
            return num
            break

整数翻转

这个题目用递归做当然是最快啦。但是感觉字符串的翻转程序比较好写,就内部定义了一个程序,先把整数转换成字符串再反转,再转换回来。

def reverse(self,x):
    def rev(y):
        if y == '':
            return ''
        return y[-1]+rev(y[:-1])
    if (x > 0) and (int(rev(str(x))) < 2**31-1):
        return int(rev(str(x)))
    elif (x < 0) and (-int(rev(str(-x))) > -2**31):
        return -int(rev(str(-x)))
    else:
        return 0

你可能感兴趣的:(python)