如何在不使用任何内置方法的情况下删除数组元素并将其附加到 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]

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

标准方法是:

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

根据我在评论中提供的链接,我使用该问题的答案将其放在一起。

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 内置(无论你以什么方式看待它,你都需要在索引处获取值并在索引处设置一个值来做到这一点(

我想

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

您可以在赋值期间分解数组:

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(作为新数组(。

同样,您可以在赋值期间隐式创建一个数组:

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,没有显式调用任何方法。

由于模数,您可以使用位于正确位置的元素创建一个新的数组:

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()是一个内置方法,;)

最新更新