Почему возвращается false до того, как переменная запуска будет равна значению запуска в Ruby? Практически увеличивающаяся последовательность кодовых боев
Одним из инструментов, которые я использую для улучшения кодирования, является Codefights. Я застрял на той же проблеме в течение нескольких дней и мог бы помочь мне разобраться. Может кто-нибудь сказать мне, что я здесь делаю не так?
Вот инструкции от CodeFights:
Учитывая последовательность целых чисел как массив, определите, возможно ли получить строго возрастающую последовательность, удалив не более одного элемента из массива.
пример
Для sequence = [1, 3, 2, 1] выходные данные должны быть почти IncreasingSequence(sequence) = false;
В этом массиве нет ни одного элемента, который можно было бы удалить, чтобы получить строго возрастающую последовательность.
Для sequence = [1, 3, 2] выходные данные должны быть почти IncreasingSequence(sequence) = true.
Вы можете удалить 3 из массива, чтобы получить строго возрастающую последовательность [1, 2]. Кроме того, вы можете удалить 2, чтобы получить строго возрастающую последовательность [1, 3].
Ввод, вывод
[ограничение по времени] 4000 мс (руб.) [вход] последовательность array.integer
Ограничения: 2 ≤ sequence.length ≤ 105, -105 ≤ sequence [i] ≤ 105.
[выходной] логический
Вернуть true, если возможно удалить один элемент из массива, чтобы получить строго возрастающую последовательность, в противном случае вернуть false.
Ниже приведен код, который я пытаюсь. Я заскочил puts "#{prev}"
несколько раз, чтобы увидеть, что prev
устанавливается первоначально после 1
добавлен в wrong
и в самом конце, так что последний prev
записано.
def almostIncreasingSequence(sequence)
prev = [sequence[0], sequence[1]].min
puts "#{prev}"
wrong = 0
(sequence.length - 1).times do |num|
if prev < sequence[num + 1]
prev = sequence[num + 1]
else
wrong += 1
return false if wrong == 2
puts "#{prev}"
end
end
puts "#{prev}"
true
end
Это единственный тест, который не пройдет сейчас:
(almostIncreasingSequence([1, 2, 3, 4, 99, 5, 6])
Это должно быть правдой, потому что 99
можно вытащить, и возрастающая последовательность может продолжаться. Но false
возвращается вроде бы после wrong
добавляется только один раз.
Код должен вернуться false
если wrong == 2
От puts "#{prev}"
выходной, я вижу, что prev
берет свое начало в 1
и wrong
срабатывает, когда 99
больше чем 5
и с тех пор wrong
должен быть только в 1
Я не понимаю, почему это возвращается false
немедленно. Я могу пройти этот тест, если я установлю prev = sequence[num - 1]
после wrong
добавляется в первый раз, но тогда многие другие тесты не пройдут. Вот список других тестов, которые я пробую. Большинство тестов, которые Codefights требует от вас, чтобы перейти к следующему тренировочному коду.
(almostIncreasingSequence([1, 3, 2])) #true
(almostIncreasingSequence([1, 2, 1, 2])) #false
(almostIncreasingSequence([10, 1, 2, 3, 4, 5])) #true
(almostIncreasingSequence([0, -2, 5, 6]) )#true
(almostIncreasingSequence([1, 2, 3, 4, 5, 3, 5, 6])) #false
(almostIncreasingSequence([40, 50, 60, 10, 20, 30])) #false
(almostIncreasingSequence([1, 2, 3, 4, 3, 6])) #true
(almostIncreasingSequence([100, 200, 300, 400, 99, 500, 600])) #true
(almostIncreasingSequence([1, 3, 2, 1])) #false
(almostIncreasingSequence([1, 4, 10, 4, 2])) #false
(almostIncreasingSequence( [1, 1, 1, 2, 3])) #false
(almostIncreasingSequence([1, 1])) #true
(almostIncreasingSequence([10, 1, 2, 3, 4, 5, 6, 1])) #false
Заранее спасибо за любой свет, который вы можете пролить на эту проблему.
1 ответ
Похоже, неправильно добавляется только один раз, потому что ваш puts
приходит после return
так что это никогда не называется. Перемещение до возврата показывает, что на самом деле неправильное значение увеличивается вдвое.
Суть вашей проблемы в том, что когда вы увеличиваете неправильно, ваш prev
значение остается равным 99
что делает каждое последующее значение неправильным. Вам нужно установить prev
в sequence[num - 1]
чтобы предотвратить это, но, как вы сказали, это вызывает ошибки. Это потому, что когда вы удаляете неправильное число из массива (т.е. [1, 2, 1, 2] -> [1, 1, 2]
вам нужно еще раз проверить, работают ли два последовательных числа, которые в данном случае не работают.
Вы можете это исправить, но тогда вы столкнетесь с другой ошибкой в таких ситуациях, как [10, 1, 2, 3, 4, 5]where your starting
значение prev` на самом деле не ваше первое значение.
В конечном итоге вы столкнетесь с множеством ошибок, потому что логика вашего решения сложна и не понятна для человека. Вы можете в конечном итоге получить свой ответ, следуя этому методу, но, возможно, вы захотите вернуться к проблеме и перепроектировать свой код с нуля.