Google codeJam の資格ラウンドの問題の 1 つは、与えられた 2 つの整数の間に「リサイクルされたペア」がいくつあるかを見つけることでした。
これが私の解決策でしたが、大きなデータ入力セットには十分な速度ではありませんでした。@a = 10, @b = 200000 のようなものを指定すると、遅くなり始めます。
私の解決策は O(2^n) (大きな O 分析についてはまだしっかりと把握していません) になると思いますが、これは恐ろしいことです。より高速なアルゴリズムを使用して、このような 2 つのループを反復する標準的な方法があるかどうか疑問に思っていましたか?
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) は、12345 の末尾から 345 を前に移動することで 34512 を取得できるため、リサイクルされたペアです。n と m は、リサイクルされたペアになるために同じ桁数でなければならないことに注意してください。n も m も先行ゼロを持つことはできません。