为什么在触发变量等于Ruby中的触发值之前返回false?几乎增加序列规则战斗

时间:2017-03-22 20:24:24

标签: arrays ruby lis

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

以下是CodeFights的说明:

  

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

     

实施例

     

对于sequence = [1,3,2,1],输出应为   almostIncreasingSequence(sequence)= false;

     

此阵列中没有可以删除的元素   得到一个严格增加的序列。

     

对于sequence = [1,3,2],输出应为   almostIncreasingSequence(sequence)= true。

     

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

     

输入/输出

     

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

     

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

     

[output] boolean

     

如果可以从数组中删除一个元素,则返回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 1}}记录。

(almostIncreasingSequence([1, 2, 3, 4, 99, 5, 6]) 

这是目前唯一无法通过的测试:

99

这应该是 true ,因为可以拉出false并且可以继续增加序列。但wrong似乎仅在false仅添加一次后才会返回。

代码应返回wrong == 2 puts "#{prev}"prev输出中,我可以看到1来自wrong995超过wrong并且1应该只有false时触发,我不明白为什么它会立即返回prev = 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 ,我可以通过此测试,但随后很多其他测试都无法通过。这是我正在尝试的其他测试的列表。大多数是Codefights要求您通过的测试,然后才能转到下一个练习代码。

$ mkdir a b
$ touch a/1
$ touch b/1

提前感谢你能解决这个问题。

1 个答案:

答案 0 :(得分: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`值实际上不是你的第一个值。

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