劍指 Offer56位運算 出現一次系列

2021-10-10 08:21:50 字數 1510 閱讀 7862

題目1:

乙個整型陣列 nums 裡除兩個數字之外,其他數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。要求時間複雜度是o(n),空間複雜度是o(1)。

示例 1:

輸入:nums = [4,1,4,6]

輸出:[1,6] 或 [6,1]

示例 2:

輸入:nums = [1,2,10,4,1,4,3,3]

輸出:[2,10] 或 [10,2]

分析:理論基礎:數字轉為二進位制後,0,1的異或運算,相同為0,不同為1,0與0異或為0;因此任何十進位制進行異或,如果兩個數相同結果為0,不同則一定不為0**換為二進位制一定有位不同,保證了不會為0),任何數和0進行異或結果不變;異或運算滿足結合律交換律。

思路:1、 異或運算,與運算。①全部異或,結果為兩個出現一次數字進行異或的結果,結果不為0,相應的二進位制至少存在某位為1。②從最低位向前尋找,具體使用只有1位為1的中介,與全部異或的結果進行與運算,找到乙個為1的位。③所有元素與中介進行與運算,分為兩組,注意此時兩個出現一次數字,會被分在不同組,其他任意出現兩次的數字,都會被分在相同的組。④組內分別全部異或運算。

**實現:

時間複雜度o(n),空間複雜度o(1)

class

solution

int first =1;

while

((sum & first)==0

)int

result =

newint[2

];for(

int i =

0; i < nums.length; i++

)else

}return result;

}}

題目2:

給定乙個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現了三次。找出那個只出現了一次的元素。

說明:你的演算法應該具有線性時間複雜度。 你可以不使用額外空間來實現嗎?

示例 1:

輸入: [2,2,3,2]

輸出: 3

示例 2:

輸入: [0,1,0,1,0,1,99]

輸出: 99

分析:當陣列中只出現一次的那個數字k在二進位制的對應位為0時,該對應位為1在陣列各個數字**現的總次數應當為3n,當k的對應位為1時,該對應位為1在陣列各個數字**現的總次數應當為3n + 1。

思路:1、統計所有數各二進位制位下1的個數,對3取餘,所有二進位上對應的餘數組合起來要尋找的數字;

2、 異或運算思路,

**實現:

時間複雜度o(n),空間複雜度o(1)

class

solution

}//1 的個數是否是 3 的倍數

if(count %3!=

0)}return ans;

}}

思路2 待解釋

class

solution

return seenonce;

}}

劍指Offer56 陣列中數字出現的次數

題目一 陣列中數字只出現一次的兩個數字。乙個整形陣列裡除兩個數字之外,其它數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。要求時間複雜度為o n 空間複雜度是o 1 解題思路 位運算中異或運算的性質 兩個相同數字等於0,乙個數和零異或還是它本身。當只有乙個數出現一次時,我們把陣列中所有的數依次...

劍指offer 56陣列中數字出現的次數

乙個整型陣列 nums 裡除兩個數字之外,其他數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。要求時間複雜度是o n 空間複雜度是o 1 在做這道題之前你需要知道 異或運算子的性質。也就是 異或 相同為0,不同為1 舉個例子 3 5 3的二進位制 0 0 1 1 5的二進位制 0 1 0 1 ...

劍指offer 56題 陣列中數字出現的次數2

在乙個陣列 nums 中除乙個數字只出現一次之外,其他數字都出現了三次。請找出那個只出現一次的數字。示例 1 輸入 nums 3,4,3,3 輸出 4 示例 2 輸入 nums 9,1,7,9,7,9,7 輸出 1 利用位運算,當乙個陣列 現的其他數字都為3次時,所有數字的每一位加起來的各自的值對3...