zoukankan      html  css  js  c++  java
  • python(leetcode)-136只出现一次的数字

    给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
    
    说明:
    
    你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
    
    示例 1:
    
    输入: [2,2,1]
    输出: 1
    示例 2:
    
    输入: [4,1,2,1,2]
    输出: 4
    

    先说自己的思路 这题和217存在重复问题相似 这题找数组中只有一次的数字 而存在重复问题是找出现两次的数字 

    所以我先排序 然后以2为间隔两两进行对比 是否相同 如果不同则return值 如果倒数第二个之前都是相同的 则return 最后一个值

    上代码(通过)

     1 class Solution:
     2     def singleNumber(self, nums):
     3         """
     4         :type nums: List[int]
     5         :rtype: int
     6         """
     7         nums.sort()
     8         for i in range(0,len(nums),2): #以2为间隔 两两对比
     9             if(i==(len(nums)-1)):      #倒数第二个之前都相同 返回最后一个值
    10                 return nums[i]
    11             else:
    12                 if(nums[i+1]!=nums[i]):
    13                     return nums[i]
    14 if __name__=="__main__":
    15     s=Solution()
    16     nums=[5,3,5,6,7,3,6]
    17     print(s.singleNumber(nums))

    运行时间为60ms 只击败49%的用户

    代码虽然通过检测 但是分析过程发现 首先的排序时间复杂度就为O(nlogn) 并不是线性的 所以虽然通过测试但不是最优

    第二种思路 (看评论区大佬写的) 利用按位异或运算符 进行操作

     1 class Solution:
     2     def singleNumber(self, nums):
     3         """
     4         :type nums: List[int]
     5         :rtype: int
     6         """
     7         a = 0
     8         for num in nums:
     9             a = a ^ num
    10         return a
    11 
    12 if __name__=="__main__":
    13     s=Solution()
    14     nums=[5,3,5,6,7,3,6]
    15     print(s.singleNumber(nums))

    运行代码 48ms 击败99.8%的用户

    会发现效率提升其实很明显 虽然代码相对简单 4行解决 但是可能理解起来较难

    分析一下亦或运算符^ :当两对应的二进位相异时,结果为1。

    首先这是对两个二进制数字进行操作 如果对应位相异为1否则为0

    a^a=0
    0^a=a
    a^b=b^a
    a^a^b=b
    a^b^c=(a^b)^c=a^(b^c)
    

      

  • 相关阅读:
    day_07 深浅拷贝
    day_06 再谈编码
    day_05 字典
    day_04 列表
    day_03 字符串
    HDU 1049 Climbing Worm
    HDU 1720 A+B Coming
    Pascal向C++的跨越
    B-Boxes
    喵哈哈村的狼人杀大战(4)
  • 原文地址:https://www.cnblogs.com/bob-jianfeng/p/10361434.html
Copyright © 2011-2022 走看看