【一】Leetcode之Python刷题之路

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/c369624808/article/details/79166096

  申请完了github帐号,又在Leetcode上发现了新大陆,从昨天开始刷题了,感觉很有意思。看视频学习Python动手不太多,现在开始刷题练习自己的代码水平,leetcode上还有很多大神,快哉美哉!
  代码我都放到github里了https://github.com/Ray1225/Python_Training,欢迎大家关注并指正。话不多说,怒上代码。

1. Hamming Distance

The Hamming distance between two integers is the number of positions at which the corresponding bits are different.

Given two integers x and y, calculate the Hamming distance.

Note:
0 ≤ x, y < 231.
Example:

Input: x = 1, y = 4

Output: 2

Explanation:
1   (0 0 0 1)
4   (0 1 0 0)
       ↑   ↑

简单点说,就是输入两个数字,比较两个数字的二进制的差异,最终输出差异的距离——hamming距离。

  首先说一下我的思路,我在IDLE试了一下1转化成2进制为’0b1’,4转化为二进制为’0b100’,如果用string的方式来逐一比较的话需要将1的二进制’0b1’补齐,和’0b100’保持一致即’0b001’,这样才可以逐一对比,并计算”hamming distance”。

class Solution(object):
    def hammingDistance(self,x, y):
        c = bin(x)
        d = bin(y)
        (c1,c2)=c.split('b') #将二进制分割,我们仅需要'0b'右边的有效数字
        (d1,d2)=d.split('b')
        #通过下述代码来达到两个二进制数能够相互对齐的目的。
        if len(c2)>len(d2):
            d3 = d2.zfill(len(c2))# 这里zfill()函数是返回,并不是将d2修改,这里不要犯错。
            c3 = c2
        else:
            c3 = c2.zfill(len(d2))
            d3 = d2
        countall = 0
        number = 0
        for i in c3:# 进行计算hamming distance
            if i != d3[number]:
                countall+=1
            number+=1
        return countall

上面的代码最后提交成功了,但是自己感觉代码太辣鸡,看了Disscusion里大神的代码,真的折服了,一行搞定。

return bin(x^y).count('1') # python里'^'符号为求异或

2. Single Number

Given an array of integers, every element appears twice except for one. Find that single one.
即给定一个均为整数的数组,除了其中一个数字出现一次,其他均出现了两次,找到这个出现一次的数字。加入给[1,2,3,3,4,4,2],则输出1。

  首先将该数组从小到达排序,然后依次从第二个数开始,对比其是否与第1个不同且与第3个不同,如果是,则代表该数字为我们要找的。代码如下:

class Solution(object):
    def singleNumber(self, nums):
        if len(nums) == 1:#如果数组长度为1,则输出该数字。其实我这里考虑多了,题目的意思应该是该数组长度大于等于3
            return nums[0]
        else:
            nums.sort()# 排序
            #以下两个if判断头尾两个数字是否为single number
            if (nums[0] != nums[1]):
                return nums[0]
            if (nums[len(nums)-1] != nums[len(nums)-2]):
                return nums[len(nums)-1]
            else:
                for i in range(1,len(nums)-1):
                    if (nums[i]!=nums[i+1] and nums[i]!=nums[i-1]):
                        return nums[i]

下面上一下大神的代码:
Approach 1: 这是一个比较讨巧的方法,直接将原数组用set()去重以后,求和并乘2再减去原数组的和,得到single number。厉害

class Solution(object):
    def singleNumber(self, nums):
        return 2 * sum(set(nums)) - sum(nums)

Approach 2:利用Hash表来实现,这里将数组里的数赋值为哈希表的下标,也很巧妙,且复杂度低。

class Solution(object):
    def singleNumber(self, nums):
        Hash_table = {}
        for i in nums:
            try:
                Hash_table.pop(i) #如果该下标存在数据,则删除.如果某数字出现两次,则会被添加一次和删除一次
            except:# 否则,将该下标的数据赋值为1
                Hash_table[i] = 1
        return Hash_table.popitem()[0]

3. Find All Numbers Disappeared in an Array

Given an array of integers where 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and others appear once.

Find all the elements of [1, n] inclusive that do not appear in this array.

Could you do it without extra space and in O(n) runtime? You may assume the returned list does not count as extra space.
给定一数组,共n个数,求这个数组中[1,n]内未出现的数字。
Example:

Input:
[4,3,2,7,8,2,3,1]

Output:
[5,6]

我的代码:

class Solution(object):
    def findDisappearedNumbers(self, nums):
        length = len(nums) # 求数组长度
        nums.sort() # 排序数组
        num_set = set(nums) # 去重
        list_allset = set(list(range(1,length+1))) #定义一个从1到n开始的set
        return list(list_allset - num_set) #两个set相减便得到最终结果

这个问题对自己的代码还是比较满意的,以上问题大家有好的想法思路或者觉得我写的有问题,欢迎留言交流,谢谢!

展开阅读全文

没有更多推荐了,返回首页