我想将索引 2 处的元素移动到数组 [1, 2, 3, 4]
的开头,结果数组应该类似于 [3, 1, 2 , 4]
。
我的解决方案是执行以下操作
[3] + ([1, 2, 3, 4] - [3])
有更好的方法吗?
最佳答案
一种方法,它从数组中获取前 n
个元素并将它们旋转一个,然后将剩余的元素加回去。
def rotate_first_n_right(arr, n)
arr[0...n].rotate(-1) + arr[n..-1]
end
rotate_first_n_right([1,2,3,4], 3)
# => [3, 1, 2, 4]
如果我们尝试在太短的数组上使用它,这确实会失败,因为 arr[n..-1]
切片将产生 nil
这将当我们尝试将它添加到第一个数组时会导致错误。
我们可以通过将两个切片扩展到一个列表中来解决这个问题。
def rotate_first_n_right(arr, n)
[*arr[0...n].rotate(-1), *arr[n..-1]]
end
要了解为什么会这样,举一个非常简单的例子:
[*[1, 2, 3], *nil]
# => [1, 2, 3]
你的例子的一个问题是如果 3
在数组中出现不止一次会发生什么。例如
[1,2,3,3,3,4] - [3]
# => [1, 2, 4]
https://stackoverflow.com/questions/75065681/