相关疑难解决方法(0)

用于M位置的圆移N大小数组的最快算法

M位置的圆移位阵列的最快算法是什么?
例如,[3 4 5 2 3 1 4]班次M = 2个位置应该是[1 4 3 4 5 2 3].

非常感谢.

arrays puzzle algorithm math programming-pearls

32
推荐指数
4
解决办法
3万
查看次数

将圆形缓冲器移位/对齐/旋转到原位为零

我正在使用循环缓冲区将数据推送到列表的任何一端.在我完成之后,我想对齐缓冲区,使列表中的第一个元素位于零位置,并且可以像常规数组一样使用,而不需要任何花哨的索引开销.

所以我有我的循环list容量N,它有n从任意索引开始的元素f.

在此输入图像描述

移动/旋转所有元素的最快方法是f = 0什么?

问题是我想要就地做到这一点(当然,当然需要一些寄存器/临时工).缓冲区可能是full(n = N),[ EDIT ],但我也有兴趣有效地处理它几乎为空的情况.

arrays algorithm list circular-buffer

13
推荐指数
1
解决办法
3353
查看次数

如何在没有分配的情况下将循环缓冲区转换为O(n)中的向量?

我有一个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交换操作中完成.对于具体的价值tailbuf.len()我已经能够找出解决方案,但我不知道如何在一般情况下这样做.

我的递归部分解决方案可以在行动中看到.

algorithm circular-buffer rust

2
推荐指数
2
解决办法
487
查看次数

数组循环旋转解释

前提:我的问题不是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)

python arrays algorithm list

2
推荐指数
1
解决办法
3948
查看次数

使用 O(N) 原地旋转字符串

我遇到了一个简单的(如我所想的)旋转弦的练习:

将字符串旋转 K 个字符意味着从头开始剪切这些字符并将它们转移到末尾。如果 K 为负数,则字符,相反应从末尾转移到开头。

我立即发明了使用两个子字符串连接的解决方案。但是,我发现了以下补充:

如果您想要更严峻的挑战,我们鼓励您“就地”进行轮换

任务来自这里- 确保它不是我的大学作业等

我看不到任何简单的方法来做到这一点(我想应该有 O(N) 算法)。如果我将第 0 个字符复制到临时变量并将第 K 个字符复制到它的位置,然后将第 2K 个字符复制到第 K 个等的位置 - 如果 K 和字符串长度是互质的,我会成功。我想我可以管理其他 Ks 添加外循环来重复从第 1 个字符开始的过程,然后是第 2 个等 - 我认为最多 GCD(K, strlen(S))

但它看起来太笨拙了。

string algorithm optimization

1
推荐指数
1
解决办法
1932
查看次数

数组的旋转是指每个元素右移一个索引,数组的最后一个元素也移到第一位

例如,旋转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)

java arrays

-2
推荐指数
1
解决办法
5363
查看次数