首页 > 解决方案 > 边界条件测试用例未通过 - 连续子数组和

问题描述

问题:给定一个非负数列表和一个目标整数 k,编写一个函数来检查数组是否有一个大小至少为 2 且总和为 k 的倍数的连续子数组,即总和为 n* k 其中 n 也是一个整数。

示例 1:

输入:[23、2、4、6、7],k=6 输出:真

解释:因为 [2, 4] 是一个大小为 2 的连续子数组,总和为 6。

示例 2:

输入:[23, 2, 6, 4, 7],k=6 输出:真

解释:因为 [23, 2, 6, 4, 7] 是一个大小为 5 的连续子数组,总和为 42。

我的代码:

class Solution {
public boolean checkSubarraySum(int[] nums, int k) {
    int curSum=nums[0];
    int start=0;
    int k1=Math.abs(k);

    for(int i=1;i<nums.length;i++){

        while (curSum>k1 && start<i-1){
            curSum = curSum - nums[start];
            start++;
        }
       if(k1>0 && (curSum%k1)==0){
            return true;
        }
        if(curSum==0 && k1==0){
            return true;
        }


        curSum=curSum+nums[i];


    }

    return false;

}

}

我的解决方案无法通过这个测试用例 input={0,1,0} k=0。我的输出是真的。预期输出:假。如何根据我的代码引入这个边界条件?

我遵循 这个。但是没有任何关于这个测试用例的讨论。

先感谢您

标签: javaarraysfor-loopif-statement

解决方案


很明显,测试用例input={0,1,0} k=0是错误的,因为任何大小为 2 或更大的子数组将始终具有sum = 1并且 1 永远不会等于零或任何乘数为零。

简单的解决方法就是删除

if(curSum==0 && k1==0){
    return true;
}

完全从那时起方法将为讨论的测试用例返回 false 但这将引入其他失败的测试。您要测试的时间k = 0是连续出现两个零。像这样的东西

if (curSum==0 && k1==0 && (i + 1) < nums.length && nums[i] == 0 && nums[i+1] == 0) {
        return true;
}

现在我只是快速测试了这个,所以它可能需要改进,但至少它显示了需要检查的内容。


推荐阅读