問題描述:
陣列中只有乙個數出現了1次,其他的數都出現了k次,請輸出只出現1次的數。
解題思路:
陣列a中,除了某乙個數字x之外,其他數字都出現了三次,而x出現了一次。請給出最快的方法找到x。應該如何思考呢?
如果是兩個相同的就可以利用兩個相同的數異或結果為0來計算的,但這個題目中其他數字是出現了3次,因此肯定不可以再使用異或了。
我們換乙個角度來看,如果陣列中沒有x,那麼陣列中所有的數字都出現了3次,在二進位製上,每位上1的個數肯定也能被3整除。如從二進位製上看有:
1:0001
5:0101
1:0001
5:0101
1:0001
5:0101
二進位制第0位上有6個1,第2位上有3個1.第1位和第3位上都是0個1,每一位上的統計結果都可以被3整除。而再對該陣列新增任何乙個數,如果這個數在二進位制的某位上為1都將導致該位上1的個數不能被3整除。因此通過統計二進位製上每位1的個數就可以推斷出x在該位置上是0還是1了,這樣就能計算出x了。
推廣一下,所有其他數字出現n(n>=2)次,而乙個數字出現1次都可以用這種解法來推導出這個出現1次的數字。
**如下:
public
class
_出現k次與出現1次
; int len=arr.length;
char[
] kradix =
newchar
[len]
; int k=3;
//轉換k進製字元陣列
int maxlen =0;
for(int i=
0;i) int[
] resarr =
newint
[maxlen]
;for
(int i=
0;iint res=0;
for(int i=
0;i) system.out.
println
(res);}
}
執行結果如下:
出現k次與出現1次《演算法很美》
具體思路 建立乙個字元二維陣列char kradix new char len 將arr的每乙個數轉換成三進製integer.tostring arr i k 並進行翻轉 變為字串 最後整成字元陣列 同時要將最長的三進製數長度儲存if kradix i length maxlen maxlen kr...
題7 出現K次與出現1次
題目描述 乙個陣列中只有乙個數出現了1次,其他的數都出現了k次,請輸出出現了1次的那個數。原理 k個相同的k進製數之間做不進製的加法,結果為0,如,2個2得0 10個5得0 解題思路 將所有的數轉化成為k進製,然後做k進製的不進製加法運算,得出的結果再有k進製轉換位10進製。解題步驟 第一步 建立乙...
演算法習題 出現k次與出現一次
題目 陣列中有的數隻出現1次,其餘數出現k次,輸出只出現1次的數x 解題思路 1.利用技巧性結論 k個k進製的數進行不進製加法,每一位的和均為0。先把十進位制的數轉為k進製。2.轉化為k進製後要按位 列 進行計算,所以要用二維陣列的形式儲存。轉化為k進製後由於數的大小不同,長度也有可能不同,雖然對於...