LeetCode数组配对和被k整除题代码仅过93/97用例调试求助
代码逻辑漏洞点
- 遍历对象选择错误:你选择遍历原数组的每个元素,而非余数统计字典的key,会导致同一个余数的计数被重复扣减。比如处理完第一个余数为1的元素后,已经把余数1和余数k-1的计数扣减为0了,后续遍历到其他余数为1的元素时,还是会执行判断逻辑,很容易出现计数扣减错误。
- 判断分支存在逻辑冲突:你处理完
k-num == num的场景、扣减2次计数、新增1次配对后,没有结束当前元素的判断流程,会继续进入下一个if (k-num) in dictt的分支,导致多扣一次计数、多统计一次配对,直接导致统计结果错误。 - 特殊余数处理逻辑错误:余数为0的场景需要和余数为0的元素配对,但你当前的
k-num == num判断无法覆盖该场景(因为k - 0 = k ≠ 0),你把余数0的判断放在了和前一个if互斥的elif分支,很容易出现漏判。比如当存在奇数个余数为0的元素时,你的代码大概率会判断错误。
正确实现逻辑参考
你不需要遍历原数组做配对扣减,直接对余数统计字典做校验即可:
- 统计所有元素对k取模的余数出现次数
- 先校验余数为0的计数:必须是偶数,否则直接返回False
- 遍历余数r从1到k//2:
- 如果r == k - r(仅当k为偶数,r=k/2时触发):则r的计数必须是偶数,否则返回False
- 否则:余数r的出现次数必须等于余数k-r的出现次数,否则返回False
- 所有校验通过则返回True
对应修正后的代码参考:
def canArrange(self, arr: List[int], k: int) -> bool: mod_count = [0] * k for num in arr: mod = num % k mod_count[mod] += 1 # 校验余数0的计数 if mod_count[0] % 2 != 0: return False # 遍历1到k//2的余数 for r in range(1, (k // 2) + 1): if r == k - r: if mod_count[r] % 2 != 0: return False else: if mod_count[r] != mod_count[k - r]: return False return True
内容的提问来源于stack exchange,提问作者Mayank Parashar
相关产品推荐
相关产品推荐

