看到一個比較有意思的題目,記下來

 比如有
1,3,1,5,3,9,3,5,6,4,7,5,1,2,
等這樣數字公100萬個

C/C++ code
/******************************************************************************* 文 件 名 : test100.cpp 實現功能 : 微軟面試題: 有100萬個數字(1到9),其中只有1個數字重複2次,如何快速找出該數字 補充下題目 意思:我這裏每個數字 都是個阿拉伯數字,是1位的,是1到9之間的 但是有1百萬個這樣的數字 比如 12345678912 是11個這樣的數字 實現思路 : 定義9個數組,記錄1-9的出現的數字做標記,出現一次則,對應數組加1, 超過2次,在下次循環直接結束,這樣一共直到記錄8個數字後, 直接打印第9個數字,就是一共只會出現2次的數字了 作 者 : jernymy 版 權 : <Copyright(C) ... jernymy.> 日 期 : 2011-07-28 版 本 : V1.0 *******************************************************************************/ #include "stdio.h" #include "stdlib.h" // srand #include "time.h" // time #include "string.h" // memset // 最大的數據是100萬, 1000000 #define MAX_NUM 1000*1000 // 出現頻率的個數 #define OVER_VAR 2 // 記錄1-9這幾個數字出現的次數,是否出現超過2次, // 如果超過2次可以不用判斷,初始化爲0 unsigned char g_abyNumAry[10]; // 記錄總共出現超過3次的數字的個數,當超過7個時,即爲8時。 // 則可以直接打印出沒有出現超過2次的那個數字,就一定是公出現2次的數字了。 unsigned char g_nCount = 0; int main(void) { int nIdx; int nData; time_t nCurTime; srand(time(&nCurTime)); memset(g_abyNumAry, 0, sizeof(g_abyNumAry)); for (nIdx = 0; nIdx < MAX_NUM; nIdx++) { nData = rand()%9 + 1; // 隨機數從1到9,測試專用,jernymy from 1-9 printf("%d ", nData); // 打印該隨機數字 // 此數字出現次數大於2次,則退出次循環 if (g_abyNumAry[nData] > OVER_VAR) { continue; } // 此數字出現1次,在大於2次時,就對總個數加1 if (++g_abyNumAry[nData] > OVER_VAR) { g_nCount++; } // 當有8個數字出現的個數均超過2次, // 那麼剩下的那個數字一定就是要求的了 if (g_nCount == 8) { printf("\nfound only 2 num: "); for (nIdx = 1; nIdx < 10; nIdx++) { if (g_abyNumAry[nIdx] < (OVER_VAR+1)) { // jernymy 此數就是我們要找的那個了 printf("%d\n", nIdx); } } break; } } return 0; }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章