C#中嵌套if与&&短路判断的行为差异疑问
嵌套if与&&条件判断的差异及问题根源
首先明确:嵌套if和&&的条件判断逻辑本身是等价的,C#中的&&确实支持短路求值——先判断sums.ContainsKey(remain),只有结果为true时才会执行i - sums[remain] > 1的计算,这部分和嵌套if的执行逻辑完全一致。
你遇到的测试用例结果差异,问题不在条件判断的写法上,而是修改代码时破坏了哈希表的更新规则:
原代码的核心逻辑(前缀和余数法)
LeetCode 553题要求找长度≥2的连续子数组和为k的倍数,前缀和余数法的关键是:用哈希表存储余数第一次出现的索引。当后续再次出现相同余数时,两次索引的差值就是子数组长度,只要长度>1就满足条件。
原代码的完整逻辑大概是:
Dictionary<int, int> sums = new Dictionary<int, int>(); sums.Add(0, -1); // 初始化前缀和0的索引为-1 int prefixSum = 0; for (int i = 0; i < nums.Length; i++) { prefixSum += nums[i]; int remain = prefixSum % k; if (sums.ContainsKey(remain)) { if (i - sums[remain] > 1) { return true; } // 关键:余数已存在时,不更新哈希表,保留第一次出现的索引 } else { sums.Add(remain, i); // 余数不存在时,记录当前索引 } } return false;
你的修改导致的问题
你仅修改了嵌套if为&&的条件判断,但可能错误地在if语句之后无条件更新了哈希表(比如把原代码的else分支逻辑去掉,改成每次都执行sums[remain] = i),这会导致哈希表存储的是余数最后一次出现的索引,而非第一次。
针对测试用例nums = [5,0,0,0], k = 3:
- 初始哈希表:
{0: -1} - i=0:前缀和5,余数2,哈希表无2,添加
{2: 0} - i=1:前缀和5,余数2,哈希表有2,
i - sums[remain] = 1-0=1,不满足>1。原代码不更新哈希表;若你改后代码执行sums[2] = 1,哈希表变为{2:1} - i=2:前缀和5,余数2,此时哈希表中2的索引是1,
i - sums[remain] =2-1=1,仍不满足>1,若再次更新哈希表为{2:2} - i=3:前缀和5,余数2,索引差为3-2=1,还是不满足,最终返回false,与正确结果不符。
而原嵌套if逻辑中,哈希表始终保留2的第一次索引0,当i=2时,2-0=2>1,满足条件返回true,结果正确。
总结
嵌套if和&&的条件判断本身没有功能差异,问题出在你修改代码时,误改了哈希表的更新逻辑——必须保证哈希表只存储余数第一次出现的索引,不能每次都覆盖更新。
内容的提问来源于stack exchange,提问作者Tentes
相关产品推荐
相关产品推荐

