我用来改进编码的工具之一是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
来自wrong
和99
当5
超过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
提前感谢你能解决这个问题。
答案 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`值实际上不是你的第一个值。
最终,你会遇到很多错误,因为你的解决方案背后的逻辑是复杂的,对于人类来说也是不直观的。您可以最终按照此方法获得答案,但您可能需要重新审视问题并从头开始重新设计代码。