【面試題】比給定數大的最小數

今天在全新整理:微軟、谷歌、百度等公司經典面試100題[第101-160題]看到一道挺常見的題,這裏面說是Google2009華南地區筆試題,原題以下。面試

給定一個集合A=[0,1,3,8](該集合中的元素都是在0,9之間的數字,但未必所有包含),指定任意一個正整數K,請用A中的元素組成一個大於K的最小正整數。數組

好比,A=[1,0] ,K=21,那麼輸出結果應該爲100。spa

這種輸出比給定數大的最小數的題仍是很常見的,不記得有沒寫過了。。有幾天沒寫程序了,恢復一下感受,寫了一下,針對這道題的解法。.net

由於元素只有 0 到 9 且不止是否有序是否有重複,因此先哈希了一下集合 A 中的元素,哈希到 numTab 裏面,0 表示沒這個數,大於 0 表示有這個數,同時記下 A 中的最小值 min 和次小值 secMin。code

而後對 numTab 作了一下處理,這個數組第 i 個元素表示,集合 A 中大於等於 i 的最小值是多少,爲 0 表示集合 A 中沒有大於等於 i 的數。blog

這樣從最後一位看給定的數 num,有比這一位大的就能夠計算一下直接返回了,沒有的話就把這一位置成最小值 min,再看前一位,一直到最高位,若一直沒有返回,則說明比給定數大的最小數要比 num 多一位,也能夠方便計算並返回。get

其實仍是代碼這種語言解釋這種事情會比較直接。class

 1 int biggerMinNum(int *arr, int len, int num)
 2 {
 3     int min = arr[0];
 4     int secMin = 0x7FFFFFFF;
 5     int numTab[10];
 6     memset(numTab, 0, 10*sizeof(int));
 7     for(int i = 0; i < len; ++i)
 8     {
 9         numTab[arr[i]] = arr[i];
10         min = arr[i] < min ? arr[i] : min;
11     }
12     for(int i = 1; i < 10; ++i)
13     {
14         if(numTab[i] == 1 && i != min)
15         {
16             secMin = i;
17             break;
18         }
19     }
20     for(int i = 8; i >= 0; --i)
21     {
22         if(numTab[i] == 0)
23             numTab[i] = numTab[i+1];
24     }
25     int ifactor = 1;
26     int low = 0;
27     while(num/ifactor)
28     {
29         int tmp = num/ifactor;
30         tmp %= 10;
31         if(tmp < 9 && numTab[tmp+1] > tmp)
32             return (num/ifactor/10*10+numTab[tmp+1])*ifactor+low;
33         ifactor *= 10;
34         low = low*10 + min;
35     }
36     return secMin*ifactor+low;
37 }
相關文章
相關標籤/搜索