只出現(xiàn)一次的數(shù)字

給定一個非空整數(shù)數(shù)組,除了某個元素只出現(xiàn)一次以外,其余每個元素均出現(xiàn)兩次。找出那個只出現(xiàn)了一次的元素。

說明:

你的算法應該具有線性時間復雜度。 你可以不使用額外空間來實現(xiàn)嗎?

示例 1:

輸入:[2,2,1]輸出:1

示例?2:

輸入:[4,1,2,1,2]輸出:4



觀察思考,認真讀題,給了一個數(shù)組,非空!其中一個元素只出現(xiàn)一次,其他元素都出現(xiàn)二次!返回那個只出現(xiàn)一次的數(shù)字!

要求線性時間復雜度,不使用額外空間。

重點應該在于其他元素都出現(xiàn)2次。那么數(shù)組長度應該是2n+x,必為奇數(shù),


對列表中所有元素計數(shù),為1返回,沒什么大問題,好使,但是超時了


現(xiàn)在有的條件是2N+X? ?,思維有點固化了,一直思考如何做減法,但是列表不能做減法,利用集合獲得N+X,有2N+X和N+X好似好求X,但是百度幾種代替減法的方法都會去除X,利用集合相減那就是N+X? ?-? N+X,for循環(huán)尋找公共元素得到N+X,對N計數(shù)的話不如直接計數(shù)手游元素找不是2的,但那樣也是超時了,并且這種方法占用大量的空間。應該更換思路了。


在家也不閑著,昨天同學找吃飯,今天上午忙點事,現(xiàn)在下午了,昨天出去吃飯前看了一下別人的答案,用到了? ^? ?,復習一下這個吧

直接截圖粘貼了,這些符號在python中都被稱作位運算符,

位操作是程序設(shè)計中對位模式按位或二進制數(shù)的一元和二元操作。

計算機只認識0和1,也就是二進制,而人類很難理解,于是就有了位運算符稱作0和1,如實現(xiàn)A+B不用加號運算,用的就是位運算符。

一個個講解

& 按位與運算??

當兩個開關(guān)都為真,及連接時才能亮燈,在python中,何時為false,何時為trun,一般為0,或為空時為false,如數(shù)字0,空集合,空列表,空字符串,空字典,空字符串,還有表示什么都不在的None。其他都為trun。

所以操作時0&0=0,表示連個開關(guān)都為關(guān),燈也就不亮,0&1=1,表示一個開關(guān)斷開,一個開關(guān)連接,燈還是不亮,1&1=1,連個開關(guān)都連接,那么燈也亮。100&100=100.不為0,表示都連接,燈亮,100都可以認為是表示真。100&0=0,一個不連接就不亮

但5&6=4,為什么呢?重新看一下名字,按位與運算符。a&b,計算機只認識二進制數(shù)0和1,&符號運算規(guī)則是都為1就記作1,否則記作0.

先將5和6變成二進制數(shù),內(nèi)置函數(shù)bin()將10進制轉(zhuǎn)換為2進制。

bin(5)=? ?1? ?0? ?1

bin(6)=? ?1? ?1? ?0

5&6? ?=? ?1? ?0? ?0

再將2進制轉(zhuǎn)換為10進制,內(nèi)置函數(shù)int? ? int('100',2)=4

第二個運算符是? |? ?鍵盤不好找,shift加反斜杠

|? ?或運算,一真及真,

我畫的好像是電阻,不是電池,無所謂了,如圖所示,只要有一個開關(guān)連通就行。

按位或運算時只要不是a|b都不為0就行,也就是但a|b=0,那就是a=b=0.

然后就是今天的關(guān)鍵了,^,按位異或運算符,

按位運算是對二進制數(shù)的,那就是不是0就是1,對于^,當對應的二進制位相異時為1。

如bin(22)=1? ?0? ?1? ?1? ?0

????bin(7)=? ? ? ? ? ? 1? ?1? ?1? ? ? ? ? ??

? ? ? ? ? ? ? = 1? ?0? ?0? ?0? ?1

對位相異為1,不對位直接落下,相同就為0

0^0=0

0^8=? ? 0? ?0? ?0? ?0

? ? ? ? ? ? 1? ?0? ?1? ?0?

? ? ? ? ? ? 1? ?0? ?1? ?0

0^x? 如果x不為零,那么0^x=x? ? 如果x=0,0^0=0,0也是0本身

任何數(shù)和0做異或操作都為其本身

? ? ?x^x =? *? *? *? *

? ? ? ? ? ? ? ?*? *? *? *

? ? ? ? ? ? ? ? 0 0 0 0? ? ? ? ? ?任何數(shù)與其本身做異或操作都等于0? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

理解這些剩下的就簡單了

~按位取反運算符

如bin(9)=1001

~9就是對1001按位取反,0變1,1變0,那就是0110

int('0110',2)=6

<<左移運算符

>>右移運算符

箭頭指向哪里就是什么移

4<<1? ?就是4的二進制數(shù)向左移動1位

bin(4)=? ? ? ?1? ?0? ?0

?4<<1=? 1? ?0? ?0? ?0? ? =? 8? ?左移用0填補末尾

8>>2? 就是8的二進制數(shù)向右移動兩位

bin(8) =? ? 1? ?0? ?0? ?0

8>>2? =? ? ? ? ? ? ? 1? ?0? ?=? 2? ?左移多余部分舍去

按位運算符復習完了

回歸題目,一個2N+X數(shù)組求X

res =0

for i in nums:

? ? res = res ^ i

return =? res

起始為0,與nums[i]進行異或操作,

即為nums[0]^nums[1]^nums[2]^nums[3]^nusm[4]……

2N+X即N與自身做異或操作結(jié)果為0,0與X做異或操作為X


再看另一個方法,耗時長,先創(chuàng)建一個空列表,遍歷nums,如果i不在新列表中,加入新列表,在里面,去除,什么情況會在里面,那就是已經(jīng)添加進去了,已知2N+X,N一定會添加一次,第二次想添加時發(fā)現(xiàn)已存在,用remove(i)的方法的去除,最終剩下X。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容