我正在使用黑客等级,但我不明白为什么我的 ruby?? 代码仅适用于 20 个测验用例中的一个。这是问题:
这是我的代码:
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]
0 评论