【LeetCode】-- 260. Single Number III
問題描述:
https://leetcode.com/problems/single-number-iii/
在一個(gè)數(shù)組里面,只有兩個(gè)元素僅出現(xiàn)過1次,其余都出現(xiàn)過兩次。找出出現(xiàn)僅一次的那兩個(gè)(a, b)。
要求常量空間,線性時(shí)間。
問題解決:
這題用到“神奇的位運(yùn)算”。
1.因?yàn)槌颂厥獾膬蓚€(gè)元素,其余兩兩出現(xiàn),那么就想到了XOR(異或)。
2.從頭到尾XOR之后,會(huì)得到a xor b 的結(jié)果。接下來我們?cè)囍堰@兩個(gè)元素分離開來。
3.我們?cè)赼 xor b 中找到任意一位XOR[diff_pos] = 1 , 那么可知在diff_pos這位上a 和 b 是不一樣的。如果按照diff_pos這位的值
分類可以將所有數(shù)分成兩組: 1)diff_pos = 0的元素, 2)diff_pos = 1的元素。
4.對(duì)3中的兩組分別組內(nèi)xor,因?yàn)槠溆嘣囟际?兩兩出現(xiàn),那么最后就剩下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比特位確實(shí)有更好的方法:
xor = xor & ~(xor - 1);?
轉(zhuǎn)載于:https://www.cnblogs.com/luntai/p/5573932.html
總結(jié)
以上是生活随笔為你收集整理的【LeetCode】-- 260. Single Number III的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深度学习数据集+模型说明
- 下一篇: codevs 1958 刺激