为什么我需要在这里跳出循环呢?

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

我写了一个函数,返回arr中连续元素的子数组的minLength,其中总和大于num.在我自己的解决方案中,我没有脱离我需要的循环;但是,我仍然不明白为什么我需要脱离这个循环。

//returns the minlen of the contiguous subarray which sum is greater than or equal to the num

function minSubArrayLen(arr, num){
  //define variables
  let total = 0;
  let start = 0;
  let end = 0;
  let minLen = Infinity;

  while (start < arr.length){

    //when total is less then the num increase end and add it to the total
    if (total < num && end < arr.length){
      total += arr[end];
      end++;

    //when total is larger than the num start looping from the next start and subtract the previous start from the total
    } else if (total >= num){
      minLen = Math.min(minLen, (end - start));
      total -= arr[start];
      start++;

      //need to break because
    } else {
      break;
    }
  }
  return minLen === Infinity ? 0: minLen;
}



//test
console.log(minSubArrayLen([1,2,3,4,5], 200));
console.log(minSubArrayLen([5,2,3,1,6], 7));
console.log(minSubArrayLen([1,2,20,4,10], 20));

javascript while-loop infinite-loop
1个回答
0
投票

对于第一组输入,你的 total (函数的第二个参数)大于数组元素的实际总数。你的前两个条件不足以处理这组输入。

根据输入的情况,你的循环只进入了第一个条件的内部,而且只进入了 end 变量变化。start 不改变,因为 total 永远不大于或等于 num.

你的while循环取决于 start 从不在if块中修改,所以重复while循环的条件总是评价为true。一旦 if 条件对第一组参数不为真,则 else if 条件也不成立,所以如果没有 else { break; } 它进入了一个无限循环。

你可以通过改进进入 while 循环的测试来解决这个问题,使它依赖于在循环中修改的变量。

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