Функция возвращается правильно, но время ожидания в цикле while, хотя условие в конечном итоге становится ложным - PullRequest
0 голосов
/ 23 мая 2018

Попытка выполнить ката , и моя функция возвращает все правильно, но я получаю сообщение об ошибке для вывода теста, сообщающее, что время ожидания составляет 12000 мс, несмотря на то, что все тесты пройдены и завершены.Я подозреваю, что цикл while является виновником, но я поставил в двух местах, где условный цикл while перевернется в false и прекратится.Может кто-нибудь указать мне, почему эта функция работает отлично, за исключением времени ожидания?

function beggars(values, n){
  // Case if only one beggar
  if (n == 1) {
    const reducer = (accumulator, currentValue) => accumulator + currentValue;
    let finalArr = [values.reduce(reducer)]
    return finalArr;
  }

  // Case if more beggars than handouts
  let remainder;
  if (n > values.length) {
    remainder = n - values.length;
    n = values.length;
  }

  // Object creation
  let obj = {};
  let final = [];
  for (var i = 1; i <= n; i++) {
    obj[i] = 0;
  }

  // Populating object with data
  let running = true;
  while (running) {
    for (var i = 1; i <= n; i++) {
      let shift = values.shift()
      obj[i] = obj[i] + shift;
    }
    if (values.length < n) {
      for (var i = 1; i <= values.length + 1; i++) {
        let shift = values.shift();
        if (shift) {
          obj[i] = obj[i] + shift;
        }
        running = false;
      }
    }
    if (values.length == 0) {
      running = false;
    }
  }

  // Values of object into array
  for (var key in obj) {
    final.push(obj[key]);
  }

  // Pushing 0's for the left over beggars
  if (remainder) {
    for (var i = 0; i < remainder; i++) {
      final.push(0);
    }
  }

  return final;
}

1 Ответ

0 голосов
/ 23 мая 2018

В основном, каты полагаются на скорость, это означает, что лучше не использовать методы массива, такие как reduce или функции изменения массива, такие как shift.

Скорость (694 мс) определяетсяпростая for петля.

function beggars(values, n) {
  var result = Array.from({ length: n }).fill(0), // prefill array with zero
      i, l;

    for (i = 0, l = values.length; i < l; i++) {
        result[i % n] += values[i];
    }
    return result;
}

console.log(beggars([1, 2, 3, 4, 5], 1)); // [15]
console.log(beggars([1, 2, 3, 4, 5], 2)); // [9, 6]
console.log(beggars([1, 2, 3, 4, 5], 3)); // [5, 7, 3]
console.log(beggars([1, 2, 3, 4, 5], 6)); // [1, 2, 3, 4, 5, 0]
console.log(beggars([1, 2, 3, 4, 5], 0)); // []
.as-console-wrapper { max-height: 100% !important; top: 0; }
...