【英雄帖】网易 - 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 }

 

就凭这两个性质,我们就能实现代码。话不多说,代码也就寥寥数行,大家应该能心领神会了吧~

posted @ 2012-10-12 19:12  有深度的程序员面试题  阅读(2622)  评论(11编辑  收藏  举报