本文根據微信公衆號算法糰子的文章總結得到。
題目描述:在一堆正整數中,有一個數恰好出現了B次,而其他的數均出現了A次,一共N個數,求出那出現B次的數,數據保證有解,設題目的輸入爲:第一行3個正整數,n,a,b(b<a),第二行n個正整數,所有的數均在int範圍之內。輸出那個出現b次的數。
分析:採用位統計法解決此類問題。所有數的大小都在int範圍內,所以數字的長度不超過10位,開一個10*10的二維數組,用來統計,所有數字中出現在從第一位(個位)到第10位每一位上0~9這個10個數字每個數字出現的次數。
由於只有一個數出現了b次,其他數都出現了a次,因此而且b<a,因此出現了b次的數字各個位上的數字要麼與其他數有重合,會出現a*K+b次,b<a,要麼不重合,出現b次,因此無論有沒有重合,對a取餘的結果都爲b,,根據這一點,將這個數字的各個位上的數字求得組成即可,源代碼如下
<pre name="code" class="cpp">#include<stdio.h>
int main()
{
int n,a,b;
scanf("%d%d%d\n",&n,&a,&b);//吃掉換行符
int cnt[10][10]={0};
int i,j;
for(i=0;i<n;i++){
char ch;
j=0;
while((ch=getchar())>47)
cnt[j++][ch-48]++; //這條語句具有一定的技巧性,直接得到數字的統計數量
}
//輸入結束後,即可得到所有數字各個位上數字之和。
for(i=0;i<10;i++)
for(j=0;j<10;j++)
{
if(cnt[i][j]%a==b)
printf("%c",j+'0'); //這條語句的技巧在於可以直接得到重新組合的數字。
}
printf("\n");
}
測試
輸入:
10 4 2
55 67 55 67 67 76 76 67 76 76
輸出:
55