最近是校園招聘的黃金時期,各大公司的筆試題公諸於網上,身為碼農,怎能不關注呢。
除了選擇題和理論題,我都是隨便掃一下。因為選擇可以靠運氣,理論可以靠筆試前復習准備,就剩下編程題可以消遣下。
但一個人玩玩題目又有點太無聊了,所以我想出個英雄帖,歡迎大家一起來寫效率最高,代碼最優美的代碼~~
當然玩程序的同時,如果大家有工作意向的話,我可以幫忙推薦簡歷到我公司。
也歡迎大家給我提供題目,今天我選個網易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 }
就憑這兩個性質,我們就能實現代碼。話不多說,代碼也就寥寥數行,大家應該能心領神會了吧~
