0

我用来改进编码的工具之一是Codefights。我已经被困在同一个问题上好几天了,可以使用一些帮助来解决这个问题。谁能告诉我我在这里做错了什么?

以下是 CodeFights 的说明:

给定一个整数序列作为数组,确定是否可以通过从数组中删除不超过一个元素来获得严格递增的序列。

例子

对于sequence = [1, 3, 2, 1],输出应该几乎是IncreasingSequence(sequence) = false;

这个数组中没有一个元素可以被删除以获得严格递增的序列。

对于 sequence = [1, 3, 2],输出应该是几乎IncreasingSequence(sequence) = true。

您可以从数组中删除 3 以获得严格递增的序列 [1, 2]。或者,您可以删除 2 以获得严格递增的序列 [1, 3]。

输入输出

[时间限制] 4000ms (rb) [输入] array.integer 序列

约束:2 ≤ sequence.length ≤ 105,-105 ≤ sequence[i] ≤ 105。

[输出] 布尔值

如果可以从数组中删除一个元素以获得严格递增的序列,则返回 true,否则返回 false。

下面是我正在尝试的代码。我进去puts "#{prev}"了几次,看看prev最初设置了什么,在 a1被添加到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 == 2puts "#{prev}"输出中,我可以看到它prev起源于1并且在超过wrong时触发a并且因为应该只在我不明白为什么它立即返回。如果我在第一次添加a 之后设置,我可以让这个测试通过,但是很多其他测试都不会通过。这是我正在尝试的其他测试的列表。大多数是 Codefights 要求您在进入下一个练习代码之前通过的测试。995wrong1falseprev = sequence[num - 1]wrong

(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

提前感谢您对这个问题的任何了解。

4

1 回答 1

1

看起来错误只被添加一次,因为你puts在之后,return所以它永远不会被调用。在返回之前移动它表明错误实际上被增加了两次。

您的问题的核心是,当您增加错误时,您的prev值会保持设置,99这会使每个后续值都错误。您确实需要设置prevsequence[num - 1]防止这种情况发生,但就像您说的那样,这会导致错误。那是因为当你从一个数组中删除一个错误的数字时(即[1, 2, 1, 2] -> [1, 1, 2]你需要再次检查两个现在连续的数字是否一起工作,在这种情况下他们没有。

你可以解决这个问题,但是你会遇到另一个错误,比如 [10, 1, 2, 3, 4, 5] where your startingprev` 值实际上不是你的第一个值。

最终你会遇到很多错误,因为你的解决方案背后的逻辑是复杂的,而且对于人类来说是不直观的。您最终可以按照这种方法得到答案,但您可能想重新审视这个问题并从头开始重新设计您的代码。

于 2017-03-22T20:46:35.383 回答