-1

Problem: Given a list of non-negative numbers and a target integer k, write a function to check if the array has a continuous subarray of size at least 2 that sums up to the multiple of k, that is, sums up to n*k where n is also an integer.

Example 1:

Input: [23, 2, 4, 6, 7], k=6 Output: True

Explanation: Because [2, 4] is a continuous subarray of size 2 and sums up to 6.

Example 2:

Input: [23, 2, 6, 4, 7], k=6 Output: True

Explanation: Because [23, 2, 6, 4, 7] is an continuous subarray of size 5 and sums up to 42.

Mycode:

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;

}

}

My solution cannot pass this testcase input={0,1,0} k=0. My output true. Expected output :False. How can I introduce this boundary condition as per my code?

I follow this. But there is nothing which discuss about this Test case.

Thank you in advance

Encipher
  • 1,370
  • 1
  • 14
  • 31
  • it's not clear why the expected value is false. (0 + 1 + 0) = n * 0 hold for any integer n. – daphshez Feb 08 '19 at 23:26
  • It is also not clear to me. That is the reason I write this question in stack overflow for a healthy discussion. – Encipher Feb 09 '19 at 02:48

2 Answers2

0

It's very obvious that the test-case input={0,1,0} k=0 is false since any subarray of size 2 or larger will always have the sum = 1 and 1 is never equal to zero or any multiplier of zero.

The easy fix is simply to remove

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

altogether since then method will return false for the discussed test case but this will introduce other failed tests. What you want to test for when k = 0 is the occurrence of two zeros in a row. Something like this

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

Now I have only tested this quickly so it might need to be improved but at least it shows what needs to be checked.

Joakim Danielson
  • 43,251
  • 5
  • 22
  • 52
  • It is not working. If input ={0,0} and k=0. then if should return true. But int return false. I encountered this problem previously so that I include this if statement `if(curSum==0 && k1==0){ return true; }` – Encipher Feb 10 '19 at 02:03
  • @Encipher as I mentioned this wasn’t extensively tested (and not very elegant :)) but at least you got an explanation why 0,1,0 should return false for k = 0. I still think the underlying idea to check for two zeros after each other is the right way to go when k = 0 – Joakim Danielson Feb 10 '19 at 07:10
-1

The problem seems to be the following if condition in your code

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

In the first iteration itself this condition gets satisfied and returns true.You need to fix this

Hari Prasad
  • 304
  • 1
  • 6