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

瘋人張發表於2020-10-19
在其它數都出現k次的陣列中找到只出現一次的數

題目描述

給定一個整型陣列arr和一個大於1的整數k。已知arr中只有1個數出現了一次,其他的數出現k次,請返回出現了1次的數。

輸入描述:

輸入包含兩行,第一行包含兩個整數n和k, 1 < = n < = 1 0 5 , 1 < k < = 100 1<=n<=10^5, 1 < k <= 100 1<=n<=105,1<k<=100,n代表陣列arr的長度,第二行n個整數,代表陣列arr,陣列arr中每個數都是32位整數。

輸出描述:

輸出一個整數,代表唯一出現1次的數。

示例1
輸入
7 3
5 4 1 1 5 1 5
輸出
4

題解:

如果 k 個相同的 k 進位制數無進位相加,相加的結果一定是每一位上都為 0 的 k 進位制數。於是我們可以直接將每個元素的 k 進位制中的每一位進行無進位相加,最終的結果就是出現一次的元素。

程式碼:
#include <cstdio>

using namespace std;

int n, k;

int bit[32];

int main(void) {
    scanf("%d%d", &n, &k);
    int val, idx;
    int up = 0;
    while ( n-- ) {
        scanf("%d", &val);
        idx = 0;
        while ( val ) {
            bit[ idx ] += val % k;
            bit[ idx ] %= k;
            val /= k;
            ++idx;
        }
        if ( idx > up ) up = idx;
    }
    int ret = 0;
    for ( int i = up - 1; i >= 0; --i )
        ret = ret * k + bit[ i ];
    return 0 * printf( "%d\n", ret );
}

相關文章