Techioz Blog

circularArrayRotationアルゴリズムルビー

概要

私はハッカーランクを使用していますが、なぜ私のRubyコードが20ほどのテストケースのうち1つのテストケースでしか機能しないのか理解できません。質問は次のとおりです。

これが私のコードです:

def circularArrayRotation(a, k, queries)
    q = []
    
    while k >= 1
        m = a.pop()
        a.unshift m
        k = k - 1
    end
    
    for i in queries do
     v = a[queries[i]]
    q.push v
    
    end 
    
    return q

end

サンプルテキストの場合にのみ機能しますが、理由がわかりません。ご協力いただきありがとうございます。

解決策

ベンチマークは実行していませんが、これは適切な名前の Array.rotate() メソッドの仕事のようです。

def index_at_rotation (array, num_rotations, queries)
  array = array.rotate(-num_rotations)
  queries.map {|q| array[q]}
end

a = [1, 2, 3] 
k = 2
q = [0,1, 2]  

index_at_rotation(a, k, q)
#=>  [2, 3, 1]

負の回転値と nil 結果も処理します。

a = [1, 6, 9, 11]
k = -1
q = (1..4).to_a


index_at_rotation(a, k, q)
#=>  [9, 11, 1, nil]