計蒜客 單獨的數字

2021-07-30 04:15:49 字數 884 閱讀 3949

給定乙個陣列 a,除了乙個數出現一次之外,其餘數都出現三次。找出出現一次的數。

如:,找出 7。

你的演算法只能是線性時間的複雜度,並且不能使用額外的空間哦~

輸入格式

第一行輸入乙個數n(1≤n≤500),代表陣列的長度。

接下來一行輸入 n 個 int 範圍內(−2147483648…2147483647)的整數,表示陣列 a。保證輸入的陣列合法。

輸出格式

輸出乙個整數,表示陣列中只出現一次的數。

樣例輸入

4 0 0 0 5

樣例輸出

本來以為很簡單……..以為用for迴圈就能搞定,但 演算法複雜度要求…..

想了好長時間,後來在網上看了別人的解法才學會,所以記下筆記。

由於除了乙個特殊的數外,其他的數都有 3 個,使用二進位制的位運算,既然其他每次數都出現3次,那麼如果針對每一位求和並對3取餘,那麼那些出現3次的數字在這一位的和對3取餘後肯定是0。如:

1: 0 0 0 1

2: 0 0 1 0

1: 0 0 0 1

2: 0 0 1 0

1: 0 0 0 1

2: 0 0 1 0

7: 0 1 1 1

─────────

0 1 4 4

0 1 4 4 每位除以3取餘 得 0 1 1 1 => 7

#include

int main()

scanf("%d", &n);

for(int i=0; i"%d", &a);

for(int j=0; j<32; j++)

}int ans = 0;

for(int i=0; i<32; i++)

計蒜客 單獨的數字

給定乙個陣列 a a,除了乙個數出現一次之外,其餘數都出現三次。找出出現一次的數。如 找出 77。你的演算法只能是線性時間的複雜度,並且不能使用額外的空間哦 第一行輸入乙個數 n 1 leq n leq 500 n 1 n 500 代表陣列的長度。接下來一行輸入 n n 個 int 範圍內 2147...

計蒜客 單獨的數字

單獨的數字 給定乙個陣列 aa a,除了乙個數出現一次之外,其餘數都出現三次。找出出現一次的數。如 找出 777。你的演算法只能是線性時間的複雜度,並且不能使用額外的空間哦 第一行輸入乙個數 n 1 n 500 n 1 leq n leq 500 n 1 n 500 代表陣列的長度。接下來一行輸入 ...

計蒜客 單獨的數字

給定乙個陣列 aa,除了乙個數出現一次之外,其餘數都出現三次。找出出現一次的數。如 找出 77。你的演算法只能是線性時間的複雜度,並且不能使用額外的空間哦 輸入格式 第一行輸入乙個數 n 1 leq n leq 500 n 1 n 500 代表陣列的長度。接下來一行輸入 nn 個 int 範圍內 2...