GFG平台Geek and New job密码校验题提交Wrong Answer求助
GFG平台「Geek and New job」题目WA排查
问题表现
- 提交代码后平台返回Wrong Answer
- 自定义测试用例运行结果符合预期,平台未返回具体错误日志,无法定位问题
题目规则
给定一个字符串,判定是否为有效密码,有效密码需同时满足3个条件:
- 至少包含1个大写英文字母
- 至少包含1个小写英文字母
- 至少包含1个数字字符
满足所有条件输出YES,否则输出NO
约束条件
- 测试用例数量T范围:
1<=T<=10^4 - 单个字符串长度范围:
1<=|S|<=4*10^5 - 所有测试用例字符串总长度不超过
4*10^5
原提交代码
#code testcases=int(input()) while testcases!=0: s=input() lower,upper,numeric=0,0,0 for i in s: if ord(i)>=49 and ord(i)<=57: numeric+=1 elif ord(i)>=65 and ord(i)<=90: upper+=1 elif ord(i)>=97 and ord(i)<=122: lower+=1 if(upper>=1 and lower>=1 and numeric>=1): print("YES") else: print("NO") testcases-=1
错误原因
数字判定的ASCII码范围写错:
- 数字字符
0对应的ASCII码值为48,原代码数字判断的下界设为49,直接漏掉了对0的识别 - 只要测试用例中的密码仅包含数字
0、没有1-9范围内的其他数字,原代码就会误判为密码不含数字,返回错误的NO结果。自定义测试时如果没覆盖到含0的用例,就会出现本地过、提交WA的情况。
修正方案
将数字判断条件的下界从49改为48即可,修正后代码如下:
testcases=int(input()) while testcases!=0: s=input() lower,upper,numeric=0,0,0 for i in s: # 修正数字范围,包含ASCII码48对应的字符'0' if ord(i)>=48 and ord(i)<=57: numeric+=1 elif ord(i)>=65 and ord(i)<=90: upper+=1 elif ord(i)>=97 and ord(i)<=122: lower+=1 print("YES" if upper and lower and numeric else "NO") testcases-=1
小优化:三个标记位都置1后可以直接跳出当前字符串的遍历,减少不必要的计算,不过原写法在题目给定的长度约束下也不会触发超时。
内容的提问来源于stack exchange,提问作者ARINDAM MANDAL
相关产品推荐
相关产品推荐

