計蒜客 -- 單獨的數字
阿新 • • 發佈:2019-01-05
給定一個數組 A,除了一個數出現一次之外,其餘數都出現三次。找出出現一次的數。
如:{1,2,1,2,1,2,7},找出 7。
你的演算法只能是線性時間的複雜度,並且不能使用額外的空間哦~
輸入格式
第一行輸入一個數n(1≤n≤500),代表陣列的長度。
接下來一行輸入 n 個 int 範圍內(−2147483648…2147483647)的整數,表示陣列 A。保證輸入的數組合法。
輸出格式
輸出一個整數,表示陣列中只出現一次的數。
樣例輸入
4
0 0 0 5
樣例輸出
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<stdio.h>
int main(){
int sum[32], n, a;
for(int i=0; i<32; i++){
sum [i] = 0;
}
scanf("%d", &n);
for(int i=0; i<n; i++){
scanf("%d", &a);
for(int j=0; j<32; j++){
sum[j]+=a>>j&1; //取最後一位,累計求和
sum[j]%=3;
}
}
int ans = 0;
for(int i=0; i<32; i++){
ans += sum[i]<<i;
}
printf("%d\n" , ans);
}