前段时间参加了优酷土豆2016实习生招聘的在线笔试环节,由于选择的是Python开发实习生,所以整个试卷全部是Python相关的,光凭这种专一的程度,就足以落360几条街(想当初我投的360 C++实习岗位,结果笔试时冒出来PHP的题,我也是醉了)。闲言少叙,下面一起来看看今年实习的机试环节编程题。
题型概览
整个笔试部分编程环节共有三道编程题,难度相差不大,考察Python编程的基本功和一般的算法和程序设计思维,下面分别介绍这三道题。
第一题 数字加密
大意如下:输入num为四位数,对其按照如下的规则进行加密:
1、每一位分别加5,然后分别将其替换为该数除以10取余后的结果
2、将该数的第1位和第4为互换,第二位和第三位互换
3、最后合起来作为加密后的整数输出
例如: 输入:1000,输出:5556
时间限制:1s 内存限制:16MB
分析:
此题说得有点啰嗦而且拗口,其实操作过程很简单,下面就它说的前两步进行展开和详细说明:
第一步是给每一位都加5,然后除以10取余数,用这个余数替代原来的数,例如原来的某一位上的数是3,那么3+5%10=8,于是用8替换掉原来位上的3,就这么简单。
第二步题上面说1位和4位互换,2位和3位互换,而输入固定只有4位,那说的直白一些就是把这个数的位颠倒过来了,本来是1234的位置,现在变成了4321位置,这块题目说成这样有混淆视听之嫌
最后就更好说了,颠倒完了合成一个数输出就可以了。
代码实现
经过前面的分析,代码设计的逻辑就已经很清晰了。不过考虑到对输入的整数分离位不太方便,这里将它转成字符串再操作,最后再转成了整数。具体代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14#coding:utf-8
def num_jiami(num):
'''
输入num为四位数,操作,每一位加5,然后分别替换为该数除以10取余数后的结果,然后1位和4位交换,
2位和3位交换,再合起来。
'''
num_list=list(str(num))
for i in [0,1,2,3]:
num_list.append(str((int(num_list[0])+5)%10))
num_list.pop(0)
num_list.reverse()
result=''.join(num_list)
return int(result)
代码分析
第一行设定编码字符集为utf-8,因为代码中含有中文。对于Python2.x的解释器,由于默认的字符集为ASCII,遇到中文会出现错误,所以要包含。接下来定义了一个函数,输入参数为num。第8行先讲num转为str类型,假如输入1000,现在就变成了字符串”1000”,然后经过list方法后编程了单个字母组成的列表,具体为:[‘1’,’0’,’0’,’0’],这就完成了按位分割的功能,而且列表操作起来很方便。9到11行对列表中的每个数加5除以10再取余,这里没有pop再insert,而是一直pop列表首部元素,然后再尾部添加,这样操作的结果与前一种效果是一样的,这样操作完成后,对于[‘1’,’0’,’0’,’0’]来说,将会变成[‘6’,’5’,’5’,’5’]。第12行将列表逆置,对于[‘6’,’5’,’5’,’5’],就会变为[‘5’,’5’,’5’,’6’]。第13行通过str类的join方法将[‘5’,’5’,’5’,’6’]合成字符串”5556”,最后一行转为int类型再输出。
整个过程比较简单,不过为了提高运行效率,上面有两处代码看似拖沓实则有意而为之:for循环处,
1for i in [0,1,2,3]
比
1for i in range(4)
要更高效;最后得到result处没有将整个列表元素依次相加,而是采用了join方法,也是由于join操作更有效率。
第二题 求字符串的全排列
输入:一个字符串 输出:该字符串的全排列
如:输入:’abc’ 输出:abc,acb,bac,bca,cab,cba
时间限制:1s 内存限制:16MB
分析
这道题没什么好分析的,是一个很常见的全排列实现,下面给出递归的实现
代码实现1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18#coding:utf-8
def permutation(result,strs,list):
if len(list)==1:
result.append(strs+list[0])
else:
for temp_str in list:
temp_list=list[:]
temp_list.remove(temp_str)
permutation(result,strs+temp_str,temp_list)
def getshit(data):
list_input=list(data)
result=[]
permutation(result,'',list_input)
pp=','.join(result)
print pp
第三题 字符串解密
大意为:给定一个字符串作为输入,将其中的数字用数字前近邻的字母序列进行替换,字母序列重复的次数等于该数字。最后将字符串输出。
例如: 输入:’a2bc3d1’ 输出:’aabcbcbcd’
时间限制:1s 内存限制:16MB
分析
这道题题目和第一题有一点遥相呼应的味道,第一题加密,这一题解密。虽然规则不同,但是字符串操作的方式基本不变。下面给出实现代码。
代码实现1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17def com_baiyi_decode(str):
length=len(str)
#sys.stdout(length)
i=0
temp_dir=[]
result=''
while i < length:
if str[i] in ['0','1','2','3','4','5','6','7','8','9']:
if temp_dir:
for j in range(int(str[i])):
result+=''.join(temp_dir)
temp_dir=[]
else:
temp_dir.append(str[i])
i+=1
print result
总结
上面三道题都是与字符串相关的题,涉及到了str的一些基本操作,如str的拆分、合并;当然还有函数定义,基本的控制语句等。总体来说考察的都是很基础的Python编程知识和编程技能。