java - 边界条件测试用例未通过 - 连续子数组和
问题描述
问题:给定一个非负数列表和一个目标整数 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。我的输出是真的。预期输出:假。如何根据我的代码引入这个边界条件?
我遵循 这个。但是没有任何关于这个测试用例的讨论。
先感谢您
解决方案
很明显,测试用例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;
}
现在我只是快速测试了这个,所以它可能需要改进,但至少它显示了需要检查的内容。