对于 google codeJam 资格认证,问题之一是找出两个给定整数之间有多少“回收对”。
这是我的解决方案,但对于大型数据输入集来说还不够快。给定 @a = 10, @b = 200000 之类的东西,它开始变慢。
我认为我的解决方案是 O(2^n) (我还没有对大 O 分析有扎实的了解),这太可怕了。我想知道是否有一种标准方法可以用更快的算法迭代这样的两个循环?
def getPairs
(@a..@b).each do |n|
(n..@b).each do |m|
if (containsSame(n,m)) && (isMatch(@a, n, m, @b))
@recycledPairs += 1
end
end
end
end
编辑:来自Google CodeJam 网站:
假设一对不同的正整数 (n, m) 被回收,如果您可以通过将一些数字从 n 的后面移动到前面而不改变它们的顺序来获得 m。例如,(12345, 34512) 是一个循环对,因为您可以通过将 345 从 12345 的末尾移动到前面来获得 34512。请注意,n 和 m 必须具有相同的位数才能成为循环对。n 和 m 都不能有前导零。