Google Kickstart 2020 区间boring数统计代码运行结果错误排查
Boring数统计代码逻辑错误排查
两处核心逻辑问题
- 校验条件书写错误:奇数位置的数位校验分支,误将判断数位奇偶的
pos_num % 2 == 1写为了position % 2 == 1,导致奇数位置完全不检查数位本身的奇偶性,只要位置为奇数就默认该位符合要求,与题目定义完全不符。 - 全量校验逻辑颠倒:遍历数位时,代码初始标记为
False,逐位将当前位的校验结果覆盖到标记上,最终仅保留最后一个数位的校验结果,没有实现「所有数位全部满足位置-奇偶匹配规则,才判定为boring数」的要求。
举例来说,按照原代码逻辑:
- 数字6(1位,奇数位置,数位为偶数,不符合boring数定义)会因为校验条件失效被误判为合法
- 数字24(十位为2,处于奇数位置但为偶数,不符合规则)会因为逐位覆盖标记的逻辑被误判为合法
修复方案
调整校验逻辑:初始默认数字为合法boring数,逐位校验时只要发现某一位不匹配,就直接标记为非法并提前退出循环;同时修正奇偶判断的条件,确保每个位置都校验对应数位的奇偶性:
t = int(input()) for case in range(1, t+1): total_number = 0 l, r = map(int, input().split()) for number in range(l, r+1): is_boring = True num_str = str(number) for idx in range(len(num_str)): pos = idx + 1 digit = int(num_str[idx]) # 奇数位置需为奇数,偶数位置需为偶数,不满足则标记为非法 if (pos % 2 == 1 and digit % 2 != 1) or (pos % 2 == 0 and digit % 2 != 0): is_boring = False break if is_boring: total_number += 1 print(f"Case #{case}: {total_number}")
额外提示
当L、R的取值范围很大时(如达到1e9量级),暴力遍历区间内所有数字的方式会出现运行超时,实际竞赛中可通过前缀计数法:预先计算1到N范围内的boring数总数,再用f(R) - f(L-1)得到区间结果,将时间复杂度降低到与数字位数线性相关的水平。
内容的提问来源于stack exchange,提问作者Anurag Kumar
相关产品推荐
相关产品推荐

