我讨厌拼图网站的一个原因是因为他们告诉你什么时候你失败但你无法学习如何改进。我通常不喜欢发布这类问题,但我浪费了太多时间试图弄清楚为什么会失败我必须知道答案!
这是我的代码:
ARGF.each do |line|
if ARGF.lineno > 1
string_a = line.strip
string_b = line.strip
sum = string_a.size
(0...string_a.size).each do |i|
string_b[0] = ''
(0...string_b.size).each do |j|
break if string_a[j] != string_b[j]
sum = sum + 1
end
end
puts sum
end
end
这是问题(如果你好奇的话):http://pastie.org/3044657
它通过了大多数测试,但由于优化原因后来失败了。我很想知道如何优化它。我不知道如何“识别和学习”如何优化。
PS。这是最入门级的谜题,所以我非常怀疑它是通过走过这个来伤害任何人的。
答案 0 :(得分:1)
您的算法是O(n²)。通过优化代码,您无能为力。
稍微改善给定算法性能的一些想法:
j
string_a[j] != string_b[j]
sum
后,j
增加ary = line.strip.chars.to_a
n = ary.count
sum = (1...n).inject(n) do | sum, i |
sum + (n-i).times { | j | break j if ary[j] != ary[j + i] }
end
而不是计算每个相等的对。对于我的测试用例,此代码的速度大约是我的机器的两倍:
{{1}}