Почему мой код не работает правильно, иногда возвращая true вместо false? - PullRequest
0 голосов
/ 29 июня 2018

Это мой код:

function almostIncreasingSequence(sequence) {
  var counter = 0;
  for (var i = 1; i < sequence.length - 1; i++) {
    if (sequence[i] <= sequence[i - 1]) {
      counter += 1;
    } else if (sequence[i + 1] <= sequence[i - 1]) {
      counter += 1;
    }
  }
  if (counter <= 1) {
    return true;
  }
  return false;
}

console.log(almostIncreasingSequence([1, 3, 2, 1]));

console.log(almostIncreasingSequence([1, 2, 5, 5, 5]));

console.log(almostIncreasingSequence([1, 2, 3, 4, 3, 6]));

Задача этого кода:

Учитывая последовательность целых чисел в виде массива, определите, можно ли получить строго возрастающую последовательность, удалив не более одного элемента из массива.

Пример

Для sequence = [1, 3, 2, 1] вывод должен быть

almostIncreasingSequence(sequence) = false;

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

Для sequence = [1, 3, 2] вывод должен быть

almostIncreasingSequence(sequence) = true.

Вы можете удалить 3 из массива, чтобы получить строго возрастающую последовательность [1, 2]. Кроме того, вы можете удалить 2, чтобы получить строго возрастающую последовательность [1, 3].

Но он не работает правильно даже после нескольких правок. В настоящее время это массивы, с которыми код работает некорректно:

  • [1, 3, 2, 1] Возвращает true вместо false.

  • [1, 2, 5, 5, 5] Возвращает true вместо false.

  • [1, 2, 3, 4, 3, 6] Возвращает ложь вместо истины.

Я редактирую этот код давным-давно, каждый раз, когда я что-то добавляю / редактирую, проблема исправляется, но возникает другая проблема, и она остается такой.

РЕДАКТИРОВАТЬ: Пожалуйста, скажите мне, почему это не работает, не дайте мне правильный код, пожалуйста.

Ответы [ 4 ]

0 голосов
/ 29 июня 2018

Самый эффективный способ - пройти последовательность только один раз. Этот код запоминает предыдущий номер и проверяет, является ли текущий номер выше. Если оно меньше или равно, то оно помечает большее число как ошибку, поэтому следующее число может быть снова больше.

function isIncreasingWithMistakes(sequence) {
  prev = Number.MIN_VALUE;
  var mistakeCounter = 0;
  for (var number of sequence) {
    if (prev < number) {
      // The good case
      prev = number
    }
    else {
      // Found a mistake
      mistakeCounter += 1
      prev = Math.min(prev, number)  // Eliminate the higher number
    }

    // Stop immediately when there are too many mistakes
    if (1 < mistakeCounter) {
      return false
    }
  }
  return true
}

// These should be true
console.log(isIncreasingWithMistakes([1, 2, 3, 4, 3, 6]))
console.log(isIncreasingWithMistakes([10, 1, 2, 3, 4, 5]))

// These should be false
console.log(isIncreasingWithMistakes([1, 3, 2, 1]))
console.log(isIncreasingWithMistakes([1, 2, 5, 5, 5]))
console.log(isIncreasingWithMistakes([1,2,3,4,3,6,1]))
0 голосов
/ 29 июня 2018

Это похоже на работу

 function _doAlmostIncreasingSequence(_seq, recheck) {
    var warning = 0;
    var _control = _seq[0] - 1;
    for (var i = 0; i < _seq.length; i++) {
      var _test = _seq[i];
      if (_test <= _control) {
        if (recheck) {
          var test1 = _seq.slice(0);
          var test2 = _seq.slice(0);
          test1.splice(i, 1);
          test2.splice(i - 1, 1);
          return _doAlmostIncreasingSequence(test1) || _doAlmostIncreasingSequence(test2);
        }
        return false;
      }
      _control = _test;
    }
    return true;
}
function almostIncreasingSequence(_seq) {
    return _doAlmostIncreasingSequence(_seq, 1);
}
console.log("TRUE :", almostIncreasingSequence([1, 2, 3, 5, 4, 5, 6]));
console.log("TRUE :", almostIncreasingSequence([10, 1, 2, 3, 4, 5, 6]));
console.log("TRUE :", almostIncreasingSequence([4, 5, 6, 6, 7, 8]));
console.log("FALSE :", almostIncreasingSequence([4, 5, 6, 1, 2, 3]));
console.log("TRUE :", almostIncreasingSequence([1, 3, 4, 6, 7, 8, 1, 10, 11, 12]));
console.log("FALSE :", almostIncreasingSequence([1, 3, 2, 1]));
console.log("FALSE :", almostIncreasingSequence([1, 2, 5, 5, 5]));
console.log("TRUE :", almostIncreasingSequence([1, 2, 3, 4, 3, 6]));
0 голосов
/ 29 июня 2018

Я хотел сделать это из удаленного сообщения , как правильный ответ:

function almostIncreasingSequence(sequence) {
    return sequence.map((_, index) => [...sequence.slice(0, index), ...sequence.slice(index + 1)])
        .some(arr => arr.every((value, index) => index === 0 || value > arr[index - 1]));
}
0 голосов
/ 29 июня 2018

function increasingSequence(sequence,i){
  sequence = Array.prototype.slice.call(sequence);
  sequence.splice(i,1)
  var len = sequence.length;
  for(var i=0;i<len-1;i++){
    if(sequence[i]>=sequence[i+1])return false;
   }
  return true;
}

function almostIncreasingSequence(sequence) {
  var len = sequence.length;
  for(var i=0;i<len-1;i++){
    if(sequence[i]>=sequence[i+1]){
      return increasingSequence(sequence,i)||increasingSequence(sequence,i+1)
     }
   }
   return true;
}
console.log(almostIncreasingSequence([1,2,3]));
console.log(almostIncreasingSequence([1,3,2]));
console.log(almostIncreasingSequence([1,2,3,3,2]));
...