在其他數都出現k次的陣列中找到只出現一次的數

2021-08-07 04:55:08 字數 1170 閱讀 4035

這一類問題可以統稱為single-num的問題。主要涉及的知識是位運算。

最初是在牛客網上碰到了k=2和k=3的題目,在左老師的書中看到了一般情況,這裡來總結一下。

k=2時

public class solution 

res=res|(a[i]%3)<

至於為什麼採用異或來求解這個問題,左老師在書中是這樣說的。

兩個k進製的數a和b,在i位上無進製相加的結果為(a(i)+b(i))%k,如果是k個相同的k進製的數進行無進製i昂家,相加的結果一定是每一位上都是0的k進製數。

因此,我們先設乙個32位k進製陣列,其實這個陣列的大小就為32,並且每一位上都為0,然後遍歷陣列a,把陣列中的乙個整數都先轉換為k進製,然後在與我們設定的32位的陣列進行無進製相加。在遍歷結束後,把32位的k進製轉換為十進位制,k個相同的k進製的無進製相加的結果就是每一位上都是0的k進製,所以那個只出現一次的數則會被剩下來。而k=2的時候就是二進位制的異或,當k=3的時候

single number的本質,就是用乙個數記錄每個bit出現的次數,如果乙個bit出現兩次就歸0,這種運算採用二進位制底下的位操作^是很自然的。single number ii中,如果能定義三進製底下的某種位操作,也可以達到相同的效果,single number ii中想要記錄每個bit出現的次數,乙個數搞不定就加兩個數,用ones來記錄只出現過一次的bits,用twos來記錄只出現過兩次的bits,ones&twos實際上就記錄了出現過三次的bits,這時候我們來模擬進行出現3次就抵消為0的操作,抹去ones和twos中都為1的bits

public int singlenumber(int a)

return ones;

}

如果對位運算不太熟悉,可以按照左老師寫的,將陣列a中的每個數都轉換為k進製後,在同32位k進製陣列累加後轉為十進位制。

十進位制轉為k進製

public int getksysnumformnum(int value,int k)

return res;

}

k進製轉為十進位制

public int getnumformksysnum(inteo,int k)

return res;

}

ok

在其他數都出現k次的陣列中找到僅出現過一次的數字

廢話不多說,直接上題目 給定乙個陣列,在這個陣列中有呀乙個數隻出現了一次,其他的數出現次數都是k k 1 請返回這個數字。首先,我們考慮一下這個問題。對於乙個k進製的數字。如果有k個k進製的數字相加的話。會是乙個什麼樣的結果!下圖是7個7進製數字無進製相加的結果。這裡我們發現如果k個k進製的數字無進...

在其他數都出現k次的陣列中找到只出現一次的數

題目 給定乙個整型陣列arr和乙個大於1的整數k,已知arr中只有乙個數出現了一次,其他的數都出現了k次,請返回只出現1次的數。要求時間複雜度o n 空間複雜度o 1 基本思路 首先看乙個七進製數無進製相加的問題。七進製數a 6 4 3 2 6 0 1 七進製數b 3 4 5 0 1 1 1 無進製...

在其他數都出現偶數次的陣列中找到出現奇數次的數

題目 給定乙個陣列arr,其中只有乙個數出現了奇數次,其他數都出現了偶數次,列印這個數。高階問題 有兩個數出現了奇數次,其他數出現了偶數次,列印這兩個數。要求時間複雜度o n 空間複雜度 1 基本思路 整數n與0異或的結果是n,整數n與整數n異或的結果是0 同時,異或滿 換律和結合律。知道上述的內容...