出現k次與出現1次

2021-10-08 22:12:02 字數 1098 閱讀 2692

問題描述:

陣列中只有乙個數出現了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進製後由於數的大小不同,長度也有可能不同,雖然對於...