4月30天leetcode训练-Day1

第一天

写这个就是想每天做懂一道题(至少我认为我懂的题才总结出来),如果有不理解的地方,欢迎指出来,大家一起讨论一下

题目描述:给定一个非空数组,每一个元素都重复出现两次,除了一个元素,找出那个元素。

  • 法一:不考虑时间和空间复杂度:先排序,然后遍历,找出那一个;时间复杂度,python内置的sort函数,用的是timsort算法,至于timsort的时间复杂度,在最好的情况下是O(n);平均以及最差的情况下为O(nlogN);空间复杂度为O(N)。

```python
class Solution_0:
    def __init__(self,nums):
        self.nums = nums
        
   def singleNumber(self):
        n = sorted(self.nums)
        for i in range(len(n) - 1):
            if n[i] != n[i + 1]:
                return n[i]
        return 
  • 法二:在考虑时间复杂度为线性时,考虑用字典来帮助,遍历数组,当遇到新的数字时将其存入字典,如遇到重复的则将字典中的这个数字也删除;时间复杂度为O(n);空间复杂度为O(N)。

```python
class Solution_1:
    def __init__(self,nums):
        self.nums = nums
    def singleNumber(self):
        dict_nums = {}
        for n in self.nums:
            if n not in dict_nums:
                dict_nums[n] = 1
            else:
                dict_nums[n] = 0
        for k in dict_nums.keys():
            if dict_nums[k] == 1:
                return k
        return 
  • 法三:在考虑时间复杂度和不能使用额外的空间时,可以用异或的方式来解决该问题,0^= 0 = 0;1^=1 = 1;0^=1 = 1;时间复杂度为O(n);空间复杂度为O(1)
    图片来自网络截图
class Solution_2:
    def __init__(self,nums):
        self.nums = nums
    def singleNumber(self):
        rest = 0
        for n in self.nums:
            rest ^= n
            
        return rest
if __name__ == '__main__':
    nums = [2,2,3,3,1]
    s = Solution_0(nums)
    single = s.singleNumber()
    print(single)
    s_1 = Solution_1(nums)
    single_1 = s_1.singleNumber()
    print(single_1)
    s_2 = Solution_2(nums)
    single_2 = s_2.singleNumber()
    print(single_2)

注意:最后一个方法,只适用于数组中重复数字两次找到唯一不重复的情况。而上面的两种方法适用于重复多次。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值