拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 circleArrayRotation算法红宝石

circleArrayRotation算法红宝石

白鹭 - 2022-02-18 1984 0 0

我正在使用黑客等级,但我不明白为什么我的 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 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *