最近是校园招聘的黄金时期,各大公司的笔试题公诸于网上,身为码农,怎能不关注呢。
除了选择题和理论题,我都是随便扫一下。因为选择可以靠运气,理论可以靠笔试前复习准备,就剩下编程题可以消遣下。
但一个人玩玩题目又有点太无聊了,所以我想出个英雄帖,欢迎大家一起来写效率最高,代码最优美的代码~~
当然玩程序的同时,如果大家有工作意向的话,我可以帮忙推荐简历到我公司。
也欢迎大家给我提供题目,今天我选个网易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 }
就凭这两个性质,我们就能实现代码。话不多说,代码也就寥寥数行,大家应该能心领神会了吧~