我正在使用黑客等級,但我不明白為什么我的 ruby?? 代碼僅適用于 20 個測驗用例中的一個。這是問題:
John Watson 知道一個整數陣列的右旋回圈操作。一個旋轉操作將最后一個陣列元素移動到第一個位置,并將所有剩余元素向右移動一個。為了測驗 Sherlock 的能力,Watson 為 Sherlock 提供了一個整數陣列。Sherlock 是執行多次旋轉操作,然后確定元素在給定位置的值。
對于每個陣列,執行多次右圓旋轉并回傳給定索引處元素的值。
功能說明
在下面的編輯器中完成 circularArrayRotation 函式。
circularArrayRotation 具有以下引數:
int a[n]: 要旋轉的陣列int k: 旋轉次數int queries[1]:要報告的指數退貨
int[q]:a按要求旋轉的值m輸入格式
第一行包含 3 個以空格分隔的整數,
n、k和q,整數陣列中的元素數、旋轉計數和查詢數。第二行包含以n空格分隔的整數,其中每個整數i描述陣列元素a[i](其中0 <= i < n)。q隨后的每一行都包含一個整數,queries[i],a要回傳的元素的索引。約束
樣本輸入 0
3 2 3 1 2 3 0 1 2樣本輸出 0
2 3 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
它僅適用于示例文本案例,但我不知道為什么。感謝您的任何幫助,您可以提供。
uj5u.com熱心網友回復:
決議輸入的一點幫助:
#!/usr/bin/env ruby
input = ARGF.readlines.map(&:split)
n,k,q = input.shift.map(&:to_i)
a = input.shift.map(&:to_i)
queries = input.flatten.map(&:to_i)
puts <<-EOF
n = #{n}
k = #{k}
q = #{q}
a = #{a}
queries = #{queries}
EOF
輸出(來自給定的輸入):
n = 3
k = 2
q = 3
a = [1, 2, 3]
queries = [0, 1, 2]
uj5u.com熱心網友回復:
我在您的代碼中看不到任何錯誤,但我想建議一種更有效的計算方法。
首先觀察q旋轉后indexi處的元素將位于 index 處(i q) % n。
例如,假設
n = 3
a = [1,2,3]
q = 5
然后在q旋轉之后,陣列將如下所示。
arr = Array.new(3)
arr[(0 5) % 3] = a[0] #=> arr[2] = 1
arr[(1 5) % 3] = a[1] #=> arr[0] = 2
arr[(2 5) % 3] = a[2] #=> arr[1] = 3
arr #=> [2,3,1]
因此我們可以寫
def doit(n,a,q,queries)
n.times.with_object(Array.new(n)) do |i,arr|
arr[(i q) % n] = a[i]
end.values_at(*queries)
end
doit(3,[1,2,3],5,[0,1,2])
#=> [2,3,1]
doit(3,[1,2,3],5,[2,1])
#=> [1, 3]
doit(3,[1,2,3],2,[0,1,2])
#=> [2, 3, 1]
p doit(3,[1,2,3],0,[0,1,2])
#=> [1,2,3]
doit(20,(0..19).to_a,25,(0..19).to_a.reverse)
#=> [14, 13, 12, 11, 10, 9, 8, 7, 6, 5,
# 4, 3, 2, 1, 0, 19, 18, 17, 16, 15]
或者,我們可能會觀察到,在q旋轉之后, indexj處的元素最初位于 index 處(j-q) % n。
對于前面的示例,q旋轉后陣列將是
[a[(0-5) % 3], a[(1-5) % 3], a[(2-5) % 3]]
#=> [a[1], a[2], a[0]]
#=> [2,3,1]
因此我們可以改為寫
def doit(n,a,q,queries)
n.times.map { |j| a[(j-q) % n] }.values_at(*queries)
end
uj5u.com熱心網友回復:
沒有運行任何基準測驗,但這似乎是恰當命名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]
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/409368.html
標籤:
下一篇:最速下降并找到最佳步長
