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) 並不是線性的 所以雖然通過測試但不是最優

第二種思路 (看評論區大佬寫的) 利用按位異或運算符 進行操作

 在學習過程中有什麼不懂得可以加
 我的python學習交流扣扣qun,688244617
 羣裏有不錯的學習教程、開發工具與電子書籍。
 與你分享python企業當下人才需求及怎麼從零基礎學習好python,和學習什麼內容。

 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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章