給定乙個陣列 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...