Найти количество подмассивов в массиве с заданной суммой

#javascript

#javascript

Вопрос:

Вот в чем проблема: найти количество подмассивов в массиве, который имеет заданную сумму.

эта программа вводит 2 параметра number array и sum.

например: Подмассив NT([1,2,3,2,1,8,-3],5)

и результатом должно быть количество подмассивов, соответствующих заданной сумме. (вывод должен быть 3 для примера выше {2,3}, {3,2}, {8,-3} ( количество подмассивов))

Я пытался это сделать, но есть проблема, связанная с тем, что он не выполняет требование «Ответ должен быть действительным для любого заданного ввода»

Вот мой код:

 function subArrayCnt(arr, sum) {
for (var i = 0; i < arr.length; i  ) {
        var str = [];
        var csum= 0;
        var output = 0;

for (var j = i; j < arr.length; j  ) {        
        csum = arr[j];
        str.push(arr[j]);
        if (csum== sum) {       
              return(str[i]);     
             }
         }
     }
}

console.log(subArrayCnt([1,2,3,2,1,8,-3],5));
  

эта программа предоставляет количество подмассивов, но она не выполняет требование «Ответ должен быть действительным для любого заданного ввода», где должно быть исправлено? пожалуйста, любые предложения.

Комментарии:

1. как насчет 1,2,3,2,-3 и 2,3,2,1,-3 ?

2. здесь ответ должен быть действительным для любого заданного ввода, также я должен принимать отрицательные числа

3. Почему вы возвращаете ` return(str[i]); `?

4. для получения количества элементов в str. это неправильный путь?

5. @SoWeLaugh_ нет, это числа из вашего входного массива, и они также имеют сумму 5. Являются ли эти результаты допустимыми? Если нет, то почему бы и нет? Что определяет допустимый результат?

Ответ №1:

Другие ответы, похоже, игнорируют тот факт, что сумма может быть получена из любого количества элементов массива. Рекурсия — лучший подход здесь.

 function subArrayCnt(arr, sum){
  return subArrayRecurse(arr, sum, 0, [], 0)
}

function subArrayRecurse(arr, sum, currentSum, curArray, i){
  var count = 0;
  //check the current index
  var newSum = currentSum   arr[i];
  var newSubArray = curArray.concat([arr[i]]);
  if(newSum == sum) {
    console.log('found another: '   newSubArray);
    count  ;
  }
  if(i   1 < arr.length) {
    //try including the current in further sums
    count  = subArrayRecurse(arr, sum, newSum, newSubArray, i   1);
    //try not including the current in further sums
    count  = subArrayRecurse(arr, sum, currentSum, curArray, i   1);
  }
  return count;
}

console.log(subArrayCnt([1,2,3,2,1,8,-3],5));
// 8  

8 комбинаций из приведенного выше примера являются:

 1,2,3,2,-3
1,2,2
1,3,1
2,3
2,3,2,1,-3
2,2,1
3,2
8,-3
  

Ответ №2:

Из вашего примера я предположил, что сумма двух последовательных элементов должна быть суммой для квалификации.

 function subArrayCnt(arr, sum) {
    let outputArr = [];
    for(var i=0; i<arr.length; i  ){
        if(arr[i] arr[i 1]==sum){
            let obj = {l:arr[i],r:arr[i 1]};
            outputArr.push(obj);
        }
    };
    return outputArr.length;
};
  

Комментарии:

1. здесь, если мы зададим subArrayCnt([1,2,3,4],10), ответ должен быть 1. но это даст 0.

2. Должен ли [1,2,3,0,4] возвращать 1 или 0?

Ответ №3:

Попробуйте этот подход:

 function subArrayCnt(arr, sum){
  var count = 0;
  for(var i = 0; i < arr.length-1; i  ){
    for(var n = i 1; n < arr.length; n  ){
      if(arr[i]   arr[n] == sum){
        count  ;
      }
    }
  }
  return count;
}

console.log(subArrayCnt([1,2,3,2,1,8,-3],5));
// 3
  

Ответ №4:

Вы можете сделать это с помощью вложенного цикла. Это позволит получить все возможные смежные суммы, а затем вы можете сравнить эту сумму с заданной суммой и увеличить count .

 function func(arr,sum){
  if(!Array.isArray(arr)) return 0;
  let count = 0;
  let cur = 0;
  for(let i = 0;i<arr.length-1;i  ){
    cur = arr[i];
    for(let j = i 1;j<arr.length;j  ){
      cur  = arr[j];
      if(cur === sum){
        count  ;
        break;
      }
      if(cur > sum) break;
    }
  }
  return count '';
}

console.log(func([1,2,3,2,1,8,-3],5)) //3
console.log(func([1,2,3,4],10)) //1  

Комментарии:

1. getSubArrayCount([1,2,3,2,1,8,-3],5) должен быть равен 3. , getSubArrayCount([1,2,3,4], 10) эти 2 в порядке, но не соответствуют последнему требованию «Ответ должен быть действительным для любого заданного ввода». и в задаче есть подсказка: «пожалуйста, учитывайте только соседние числа».

2. @SoWeLaugh _ Дайте ссылку на проблему, я бы ее увидел.

3. ссылка не работает для внешних пользователей, вот в чем проблема. здесь проблема, как и в site. Найти количество подмассивов в массиве, который имеет заданную сумму. (совет: пожалуйста, учитывайте только смежные числа) Пример: Введите getSubArrayCount([1,2,3,2,1,8,-3],5) На выходе должно быть 3 примера комбинаций ({2,3}, {3,2}, {8,-3}) и это требование, которое необходимо выполнить: возвращаемый тип должен быть строковым. Подмассив NT([1,2,3,2,1,8,-3],5) должен быть равен 3. Подмассив NT([1,2,3,4],10) должен быть равен 1. Ответ должен быть действительным для любого заданного ввода.

4. @SoWeLaugh _ Я отредактировал код, который проверит, является элемент массивом или нет. Можете ли вы, пожалуйста, сказать, для какого конкретного ввода это не работает

5. @SoWeLaugh _ Возвращаемое значение должно быть строковым. Я отредактировал код, теперь протестируйте его

Ответ №5:

Попробуйте это:

 <script>
  function subArray(arr,sum)
{
    var subArray=new Array();
    count=0;
    for(var i=0;i<arr.length;i  )
    {
    	if(arr[i] arr[i 1]==sum)
        {
        	 subArray[count]=[arr[i],arr[i 1]]
           count  ;       
        }
    }
    return subArray;
}

console.log(subArray([1,2,3,2,1,8,-3],5));
</script>  

Ответ №6:

Попробуйте это:

Я написал эту функцию. Это соответствует требованию «Ответ должен быть действительным для любого заданного ввода».

 
function getSubArrayCount(arr, sum){

   if(!Array.isArray(arr)) return 0;

   var len = arr.length;
   var count = 0;

   for(var i = 0; i < len; i  ){
      var n = 0;
     
      for(var j = i; j < len; j  ){    
         n  = arr[j];
      
         if(n === sum) {
           count  ;
           break;
         }
      }
   }

   return count;
}

getSubArrayCount([1,2,3,2,1,8,-3],5);