某华技术股份有限公司测开笔试题分享
作者:互联网
某华股份测开笔试题
测试开发岗位社招笔试题:
为了防止被黑客取到客户输入的密码,某银行在登陆软件上以屏幕输入法输入密码,
该输入法有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):
print("密码格式非法")
return None
if not password.islower():
print("密码非法")
return None
if len(password) >=16:
print("密码超长")
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,value in enumerate(i,1): #索引默认从1开始
d[value]=index
# 等价于{value:index for i in list_s for index,value in enumerate(i,1)}
t1=0 # 初始化按键花费时间为0
t2=0 # 初始化按键之间等待时间为0
for i in password: # 计算t1
for k,v in d.items():
if i==k:
t1+=v
for i in range(len(password)-1): #遍历密码,注意只需要遍历到倒数第二个字符串
for j in range(len(list_s)):
# 判断第i个及i+1个同时在二维列表的同一元素中,时间+2
if password[i] in list_s[j] and password[i+1] in list_s[j]:
t2+=2
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 测试通过
标签:试题,测试通过,list,t1,密码,开笔,print,password,某华 来源: https://blog.csdn.net/weixin_50640351/article/details/115427860