題目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...