c# 中嵌套 if 语句的意外行为

问题描述 投票:0回答:1

我正在做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 语句有什么区别?不是短路工作吗?

c# if-statement nested
1个回答
0
投票

如果没有

else
分支,你的重构将会是正确的,但是
else
的存在改变了事情。

在原始代码中,首先评估条件

sums.ContainsKey(remain)
。如果是
false
,则执行
else
分支。
将嵌套的
if
更改为与
&&
的复合条件后,含义发生变化 - 首先评估
sums.ContainsKey(remain)
。如果是
false
,则执行
else
块 - 到目前为止一切顺利。但是,如果是
true
,则计算
i - sums[remain] > 1
条件,如果是
false
,则整个复合表达式也是
false
,因此再次执行
else
分支。

© www.soinside.com 2019 - 2024. All rights reserved.