1. 程式人生 > >計蒜客 -- 單獨的數字

計蒜客 -- 單獨的數字

給定一個數組 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); }