【LeetCode】-- 260. Single Number III
生活随笔
收集整理的這篇文章主要介紹了
【LeetCode】-- 260. Single Number III
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
問題描述:
https://leetcode.com/problems/single-number-iii/
在一個數組里面,只有兩個元素僅出現過1次,其余都出現過兩次。找出出現僅一次的那兩個(a, b)。
要求常量空間,線性時間。
問題解決:
這題用到“神奇的位運算”。
1.因為除了特殊的兩個元素,其余兩兩出現,那么就想到了XOR(異或)。
2.從頭到尾XOR之后,會得到a xor b 的結果。接下來我們試著把這兩個元素分離開來。
3.我們在a xor b 中找到任意一位XOR[diff_pos] = 1 , 那么可知在diff_pos這位上a 和 b 是不一樣的。如果按照diff_pos這位的值
分類可以將所有數分成兩組: 1)diff_pos = 0的元素, 2)diff_pos = 1的元素。
4.對3中的兩組分別組內xor,因為其余元素都是 兩兩出現,那么最后就剩下a / b 了。
代碼如下:
class Solution(object):def singleNumber(self, nums):xor = 0for num in nums:xor = xor^numdiff_pos = 0for i in range(31):if(xor & (1 << i)):diff_pos = ibreakrec = [0,0]for num in nums:if(num & (1 << diff_pos)):rec[1] ^= numelse:rec[0] ^= numreturn rec論文還沒看,又在瞎搞了。。。
找最右邊的1比特位確實有更好的方法:
xor = xor & ~(xor - 1);?
轉載于:https://www.cnblogs.com/luntai/p/5573932.html
總結
以上是生活随笔為你收集整理的【LeetCode】-- 260. Single Number III的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深度学习数据集+模型说明
- 下一篇: codevs 1958 刺激