我正在做leetcode问题#553(刚刚学习),我被时间限制例外困住了。我把我的代码给了 chatgpt 来告诉我如何优化它,它给了我这个代码:
public bool CheckSubArraySumV2(int[] nums, int k)
{
if(nums.Length < 2) return false;
Dictionary<int, int> sums = new()
{
[0] = -1
};
int sum = 0;
for(int i = 0; i < nums.Length; i++)
{
sum += nums[i];
int remain = sum % k;
if(sums.ContainsKey(remain))
{
if(i - sums[remain] > 1)
{
return true;
}
}
else{
sums[remain] = i;
}
}
return false;
}
在我理解了这个方法之后,我复制了除了这个嵌套的 if 语句之外的所有内容:
if (sums.ContainsKey(remain))
{
if (i - sums[remain] > 1)
{
return true;
}
}
我把它改成这样:
if(sums.ContainsKey(remain) && i - sums[remain] > 1)
{
return true;
}
但由于某种原因,在带有
nums = [5,0,0,0]
和 k = 3
的测试用例中,我得到了错误的答案(假而不是真)。
经过几次尝试后,我决定用嵌套的 if 语句替换 && ,由于某种原因,它工作得很好。
所以我的问题是,“&&”条件检查和嵌套 if 语句有什么区别?不是短路工作吗?
如果没有
else
分支,你的重构将会是正确的,但是 else
的存在改变了事情。
在原始代码中,首先评估条件
sums.ContainsKey(remain)
。如果是false
,则执行else
分支。if
更改为与 &&
的复合条件后,含义发生变化 - 首先评估 sums.ContainsKey(remain)
。如果是 false
,则执行 else
块 - 到目前为止一切顺利。但是,如果是 true
,则计算 i - sums[remain] > 1
条件,如果是 false
,则整个复合表达式也是 false
,因此再次执行 else
分支。