如何在不使用任何内置方法的情况下删除数组元素并将其附加到ruby中的数组前面?

时间:2017-07-11 08:47:49

标签: ruby-on-rails ruby

我有一个数组说[1,2,3,4,5,6,7,8]。我需要从用户那里获取输入并删除最后输入的数组元素数并将其附加到数组的前面。这就是我所取得的成就

     def test(number, array)
     b = array - array[0...(array.length-1) - number]
     array = array.unshift(b).flatten.uniq
     return array
     end

     number = gets.chomp_to_i
     array = [1,2,3,4,5,7,8,9]

现在将参数传递给test给我结果。但是,这里有两个问题。首先,我想在没有任何内置方法的情况下找到一种在前面附加的方法。(即不使用unshift)。其次,我在这里使用Uniq,这是错误的,因为原始数组值可能会重复。那么我如何仍然确保获得正确的输出?有人可以给我一个更好的解决方案。

4 个答案:

答案 0 :(得分:4)

标准方式是:

[1, 2, 3, 4, 5, 7, 8, 9].rotate(-3) #=> [7, 8, 9, 1, 2, 3, 4, 5]

答案 1 :(得分:1)

根据我在评论中提供的the link,我使用该问题的答案将其汇总在一起。

def test(number, array)
  reverse_array(array, 0, array.length - 1)
  reverse_array(array, 0, number - 1)
  reverse_array(array, number, array.length - 1)

  array
end

def reverse_array(array, low, high)
  while low < high
    array[low], array[high] = array[high], array[low]

    low += 1
    high -= 1
  end
end

然后是测试

array = [1,2,3,4,5,7,8,9]
test(2, array)
#=> [8, 9, 1, 2, 3, 4, 5, 7]
array = [3, 4, 5, 2, 3, 1, 4]
test(2, array)
#=> [1, 4, 3, 4, 5, 2, 3]

我认为这就是你想要的东西,我觉得充分避免了ruby内置插件(无论你怎么看待它,你都需要在索引处获取值并设置一个值准备就绪的指数)

答案 2 :(得分:1)

  

我想在没有任何内置方法的情况下找到一种在前面附加的方法

您可以在转让期间decompose an array

array = [1, 2, 3, 4, 5, 6, 7, 8]

*remaining, last = array

remaining #=> [1, 2, 3, 4, 5, 6, 7]
last      #=> 8

splat运算符(*)收集任何剩余元素。最后一个元素将分配给last,其余元素(除最后一个元素外的所有元素)都分配给remaining(作为新数组)。

同样,您可以在转让期间implicitly create an array

array = last, *remaining
#=> [8, 1, 2, 3, 4, 5, 6, 7]

这里,splat运算符会解压缩数组,因此您无法获得[8, [1, 2, 3, 4, 5, 6, 7]]

上面将最后一个元素移到前面。要以这种方式旋转数组 n ,请使用循环:

array = [1, 2, 3, 4, 5, 6, 7, 8]
n = 3

n.times do
  *remaining, last = array
  array = last, *remaining
end

array
#=> [6, 7, 8, 1, 2, 3, 4, 5]

除了times之外,没有明确调用任何方法。

答案 3 :(得分:0)

由于模数:

,您可以创建一个新元素,其元素位于正确的位置
array = %w[a b c d e f g h i]
shift = 3
n = array.size
p Array.new(n) { |i| array[(i - shift) % n] }
# ["g", "h", "i", "a", "b", "c", "d", "e", "f"]

Array.new()是一种内置方法;)