LeetCode 2125题银行激光束数量求解代码未通过全部测试用例
问题排查与修复
核心问题
你代码里的遍历并直接修改原列表的逻辑存在bug:当你在for x in bank循环中调用bank.remove(x)时,列表长度会动态缩短,导致遍历过程跳过部分元素。比如连续出现两行全0的情况,第二行不会被检测到,最终留在列表中干扰后续计算。
举个典型场景:输入为["000", "000", "101", "110"],第一次循环移除第一个"000"后,列表变为["000", "101", "110"],此时循环会直接跳到第三个元素"101",跳过了剩余的"000"。后续计算时,这个未被移除的空行会插入在有效行之间,导致本该相邻的有效行无法正确相乘累加。
修复后的代码
不要直接修改原列表,而是生成一个新的过滤列表,只保留包含1的行:
class Solution: def numberOfBeams(self, bank: List[str]) -> int: # 生成过滤后的新列表,避免遍历修改原列表的问题 filtered = [row for row in bank if row.count('1') > 0] res = 0 # 直接遍历到倒数第二个元素,简化逻辑 for i in range(len(filtered) - 1): res += filtered[i].count('1') * filtered[i+1].count('1') return res
额外优化(可选)
提前计算每行的1的数量,避免重复调用count('1'),提升效率:
class Solution: def numberOfBeams(self, bank: List[str]) -> int: # 先统计所有有效行的1的数量 ones_counts = [row.count('1') for row in bank if row.count('1') > 0] res = 0 for i in range(len(ones_counts) - 1): res += ones_counts[i] * ones_counts[i+1] return res
内容的提问来源于stack exchange,提问作者Magnus
相关产品推荐
相关产品推荐

