【英雄帖】網易 - 2012校園招聘筆試題 - 打印序列


最近是校園招聘的黃金時期,各大公司的筆試題公諸於網上,身為碼農,怎能不關注呢。

除了選擇題和理論題,我都是隨便掃一下。因為選擇可以靠運氣,理論可以靠筆試前復習准備,就剩下編程題可以消遣下。

但一個人玩玩題目又有點太無聊了,所以我想出個英雄帖,歡迎大家一起來寫效率最高,代碼最優美的代碼~~

當然玩程序的同時,如果大家有工作意向的話,我可以幫忙推薦簡歷到我公司。

也歡迎大家給我提供題目,今天我選個網易2012校園招聘的筆試題,雖然不是我出的,實現也不難,關鍵在怎么寫的好看。

我會持續更新,到時也歡迎大家斧正。


實現程序,打印出以下的序列。

(a),(b),(c),(d),(e)........(z)
(a,b),(a,c),(a,d),(a,e)......(a,z),(b,c),(b,d).....(b,z),(c,d).....(y,z)
(a,b,c),(a,b,d)....(a,b,z),(a,c,d)....(x,y,z)
....
(a,b,c,d,.....x,y,z)


OK,這題其實還是算簡單的,序列構造方法也有好幾種。

評論中 @wangweiwww  童鞋的代碼是算兼顧了准確和效率,但沒有直接實現prev_permutation

@cutejumper 童鞋代碼我沒運行,構造方法與我的方法類似,但效率看上去有點偏低,因為存下所有組合的字符串。

接下來我給出我的實現,原理我簡述下。

假如輸出長度為3的序列,如abc, abd, ..., abz, acd, ..., xyz。

這個序列滿足以下條件:

(1)字符集是a-z,序列第一個字符串是abc。

(2)該序列中所有字符串的字符是依次遞增的。

(3)該序列為字典序。

 1 void calc(int len)
 2 {
 3     // 初始化字符串(性質1)
 4     char digs[27] = "abcdefghijklmnopqrstuvwxyz";
 5     digs[len] = 0;
 6 
 7     bool flag = true;
 8     while (flag)
 9     {
10         printf("%s,", digs);
11 
12         flag = false;
13         for (int i = len-1; i >= 0; i --)
14         {
15             // 字符串從低位往高位增,滿足字典序(性質3)
16             digs[i] ++;
17             // 滿足該條件的,才能使字符依次遞增
18             if (digs[i] <= 'z'-(len-1-i))
19             {
20                 // 字符是依次遞增的(性質2)
21                 for (int j = i+1; j < len; j ++)
22                     digs[j] = digs[j-1] + 1;
23                 flag = true;
24                 break;
25             }
26         }
27     }
28     printf("\n");
29 }

 

就憑這兩個性質,我們就能實現代碼。話不多說,代碼也就寥寥數行,大家應該能心領神會了吧~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM