M位置的圆移位阵列的最快算法是什么?
例如,[3 4 5 2 3 1 4]班次M = 2个位置应该是[1 4 3 4 5 2 3].
非常感谢.
我正在使用循环缓冲区将数据推送到列表的任何一端.在我完成之后,我想对齐缓冲区,使列表中的第一个元素位于零位置,并且可以像常规数组一样使用,而不需要任何花哨的索引开销.
所以我有我的循环list容量N,它有n从任意索引开始的元素f.

移动/旋转所有元素的最快方法是f = 0什么?
问题是我想要就地做到这一点(当然,当然需要一些寄存器/临时工).缓冲区可能是full(n = N),[ EDIT ],但我也有兴趣有效地处理它几乎为空的情况.
我有一个Vec循环缓冲区的分配.假设缓冲区已满,因此分配中没有元素不在循环缓冲区中.我现在想把那个循环缓冲区变成一个Vec循环缓冲区的第一个元素也是第一个元素的地方Vec.作为一个例子,我有这个(分配)功能:
fn normalize(tail: usize, buf: Vec<usize>) -> Vec<usize> {
let n = buf.len();
buf[tail..n]
.iter()
.chain(buf[0..tail].iter())
.cloned()
.collect()
}
Run Code Online (Sandbox Code Playgroud)
显然,这也可以在不分配任何东西的情况下完成,因为我们已经有足够大的分配,并且我们有一个swap操作来交换分配的任意元素.
fn normalize(tail: usize, mut buf: Vec<usize>) -> Vec<usize> {
for _ in 0..tail {
for i in 0..(buf.len() - 1) {
buf.swap(i, i + 1);
}
}
buf
}
Run Code Online (Sandbox Code Playgroud)
遗憾的是,这需要buf.len() * tail交换操作.我很确定它可以在buf.len() + tail交换操作中完成.对于具体的价值tail和buf.len()我已经能够找出解决方案,但我不知道如何在一般情况下这样做.
我的递归部分解决方案可以在行动中看到.
前提:我的问题不是Python 中的循环旋转的重复。我不是在问如何解决问题或为什么我的解决方案不起作用,我已经解决了它并且它有效。我的问题是关于我发现的同一问题的另一个特定解决方案,因为我想了解其他解决方案背后的逻辑。
我遇到了以下循环数组旋转问题(在源代码下方):
给出一个由 N 个整数组成的数组 A。数组的旋转意味着每个元素右移一个索引,并将数组的最后一个元素移动到第一位。例如,数组 A = [3, 8, 9, 7, 6] 的旋转为 [6, 3, 8, 9, 7](元素右移一个索引,6 移至第一位)。目标是旋转阵列AK次;即A的每个元素都会右移K次。
我设法用以下Python代码解决了这个问题:
def solution(A , K):
N = len(A)
if N < 1 or N == K:
return A
K = K % N
for x in range(K):
tmp = A[N - 1]
for i in range(N - 1, 0, -1):
A[i] = A[i - 1]
A[0] = tmp
return A
Run Code Online (Sandbox Code Playgroud)
然后,在以下网站https://www.martinkysel.com/codility-circularrotation-solution/上,我找到了针对同一问题的以下奇特解决方案:
def reverse(arr, …Run Code Online (Sandbox Code Playgroud) 我遇到了一个简单的(如我所想的)旋转弦的练习:
将字符串旋转 K 个字符意味着从头开始剪切这些字符并将它们转移到末尾。如果 K 为负数,则字符,相反应从末尾转移到开头。
我立即发明了使用两个子字符串连接的解决方案。但是,我发现了以下补充:
如果您想要更严峻的挑战,我们鼓励您“就地”进行轮换
任务来自这里- 确保它不是我的大学作业等
我看不到任何简单的方法来做到这一点(我想应该有 O(N) 算法)。如果我将第 0 个字符复制到临时变量并将第 K 个字符复制到它的位置,然后将第 2K 个字符复制到第 K 个等的位置 - 如果 K 和字符串长度是互质的,我会成功。我想我可以管理其他 Ks 添加外循环来重复从第 1 个字符开始的过程,然后是第 2 个等 - 我认为最多 GCD(K, strlen(S))
但它看起来太笨拙了。
例如,旋转array A = [3, 8, 9, 7, 6] is [6, 3, 8, 9, 7]。目标是将数组旋转 AK 次;也就是说,A 的每个元素都将向右移动 K 个索引。
例如,给定数组A = [3, 8, 9, 7, 6]和K = 3,函数应该返回[9, 7, 6, 3, 8]。
我想要这个在java中。我试过这个。
public static int[] rotation(int[] a,int k) {
int[] newArray = new int[a.length];
for(int i = 0 ; i < a.length ; i++) {
int newPosition = (i + k)%a.length;
newArray[newPosition] = a[i];
}
return newArray;
}
Run Code Online (Sandbox Code Playgroud)