某华股份测开笔试题
测试开发岗位社招笔试题:
为了防止被黑客取到客户输入的密码,某银行在登陆软件上以屏幕输入法输入密码,该输入法有9个按钮,每个按钮上有不多于3个字母,字母有先后顺序,按第一个字母需要用鼠标点击按钮1次,第二个字母需要点击2次,第三个字母需要点击3次。按键时,若连续两个字母都在同一个按钮上,则输入前一个字母后需要等待一小段时间。
假设,用户的输入习惯是:点击按钮需要1单位时间,等待一小段时间为2单位时间。某次登陆的时候,9个按钮上的字母分别为azc dwf gti jql mon pkr shu vex yb,
求该客户输入密码花费的时间?
输入:
该客户的密码都是小写字母[a~z],密码长度<=16。
输出:
该客户输入密码的时间
示例:
输入 ac---->输出 6
输入 zc---->输出 7
输入 zw---->输出 4
#核心算法:
花费时间t=按键时间t1+按键之间的等待时间t2;
算法步骤:
#1、根据"azc dwf gti jql mon pkr shu vex yb",生成二维列表,如[[“a”,“z”,“c”],[],。。。];
#3、根据二维列表,生成一个字典,类似于反射,key=按键的值,value=值的索引,索引从1开始。;
#4、遍历密码,计算t1,t1=密码字符串对应的values之和;
#5、遍历密码,计算t2,当前字符与下一个字符,同时在一个子列表中,t2+=2
#6、返回t1+t2。
算法翻译成代码如下:
def count_time(password=None):
"""统计输入密码花费时间的函数"""
if not isinstance(password,str):
return None
if not password.islower():
return None
if len(password) >= 16:
return None
s = "azc dwf gti jql mon pkr shu vex yb"
list_s = list(map(lambda x:list(x),s.split()))
d = {}
for i in list_s:
for index,word in enumerate(i,1): #索引自定义从1开始
d[word] = index
# 等价于{value:index for i in list_s for index,value in enumerate(i,1)}
t1 = 0 # 初始化按键花费时间为0
t2 = 0 # 初始化按键之间等待时间为0
for i in range(len(password) -1): #遍历密码,只遍历到倒数第二个字符串
t1 += d[password[i]] #这里计算t1时,漏掉了密码的最后一个字符
for j in range(len(list_s)):
# 判断当前字符及下一个字符,在二维列表的同一子列表中,时间+2
if password[i] in list_s[j] and password[i+1] in list_s[j]:
t2 += 2
t1 += d[password[-1]] #将最后一个字符的按键时间补上
return t1+t2
if __name__ == "__main__":
print(count_time("ac")) #返回6 测试通过
print(count_time("zc")) #返回7 测试通过
print(count_time("zw")) #返回4 测试通过
print(count_time("abcd")) #返回7 测试通过
print(count_time("fffffff")) #返回33 测试通过
print(count_time()) #返回None 测试通过
print(count_time("")) #返回None 测试通过