用c++将数组旋转k步

2uluyalo  于 2023-02-01  发布在  其他
关注(0)|答案(3)|浏览(151)

我们已经给出了一个大小为n的数组,我们必须将其旋转k次,其中k在某些情况下可以大于n。
我的努力-

#include<iostream>
using namespace std;

void inputarray(int arr[],int size){
    for(int i=0;i<size;i++){
        cin>>arr[i];
    }
}

int main(){
    
    int n;
    cin>>n;
    int arr[100];

    inputarray(arr,n);

    int ansarr[n];

    int k;
    cin>>k;

    k = k%n;
    int j=0;

    for(int i =n-k;i<n;i++){
        ansarr[j++] = arr[i];
    }
    for(int i=0;i<=k;i++){
        ansarr[j++]=arr[i];
    }
    for(int i=0;i<n;i++){
        cout<<ansarr[i];
    }

}

我的输出在k〉2时是正确的,就像k = 3时的输出是-
6
1 2 3 4 5 6
3
456123
这是正确的,但是对于k〈2,比如k = 2,1和0,我的输出是不正确的。
6
1 2 3 4 5 6
2
561234199699
所以我哪里做错了,有人能告诉我吗?

y53ybaqx

y53ybaqx1#

您可以使用单个循环执行旋转,这是完全安全的,使用

for (int i= 0; i < n; i++)
{
   ans[i]= arr[(i + k) % n];
}

现在你可以去掉循环中的模,注意到i + k仍然在[0, n)中,i[- k, n - k)中,因此在[0, n - k)中,i + k - n仍然在[0, n)中,i[n - k, 2n - k)中,因此在[n - k, n)中。

k= k % n;
int i;
for (i= 0; i < n - k; i++)
{
   ans[i]= arr[i + k];
}
for (    ; i < n    ; i++)
{
   ans[i]= arr[i + k - n];
}

注意:由于操作符%的行为,上面的代码对于k < 0将失败。

xbp102n0

xbp102n02#

对于初学者,请注意这样的可变长度数组

int ansarr[n];

不是标准的C++功能。您应该像声明数组arr那样声明该数组

int ansarr[100];

或者,您可以使用标准容器std::vector来代替数组。
无论如何你的代码都是错误的至少因为这个for循环

for(int i =n-k;i<n;i++){
    ansarr[j++] = arr[i];
}

应从等于ki开始,而不是从i = n - k开始

for(int i = k;i<n;i++){
    ansarr[j++] = arr[i];
}

相应地第二个for循环应该是

for(int i=0;i < k;i++){
    ansarr[j++]=arr[i];
}

也就是说,循环的条件应该类似于i < k
您的程序适用于k等于3的情况,因为当n等于6时,表达式n - k会产生相同的值3
请记住,您可以使用在头文件<algorithm>中声明的标准算法std::reverse_copy
这是一个演示程序

#include <iostream>
#include <algorithm>

int main()
{
    const size_t N = 6;
    for (size_t k = 0; k < N; k++)
    {
        int a[N] = { 1, 2, 3, 4, 5, 6 };
        int b[N];

        std::rotate_copy( a, a + k, a + N, b );

        std::cout << k << ":";

        for (size_t i = 0; i < N; i++)
        {
            std::cout << ' ' << b[i];
        }

        std::cout << '\n';
    }
}

程序输出为

0: 1 2 3 4 5 6
1: 2 3 4 5 6 1
2: 3 4 5 6 1 2
3: 4 5 6 1 2 3
4: 5 6 1 2 3 4
5: 6 1 2 3 4 5

至于你的for循环方法,那么只使用一个for循环就足够了。

#include <iostream>

int main()
{
    const size_t N = 6;
    for (size_t k = 0; k < N; k++)
    {
        int a[N] = { 1, 2, 3, 4, 5, 6 };
        int b[N];

        for (size_t j = 0, i = k; j < N; i = ( i + 1 ) % N)
        {
            b[j++] = a[i];
        }

        std::cout << k << ":";

        for (size_t i = 0; i < N; i++)
        {
            std::cout << ' ' << b[i];
        }

        std::cout << '\n';
    }
}

程序输出与上图相同

0: 1 2 3 4 5 6
1: 2 3 4 5 6 1
2: 3 4 5 6 1 2
3: 4 5 6 1 2 3
4: 5 6 1 2 3 4
5: 6 1 2 3 4 5
velaa5lx

velaa5lx3#

我不知道问题描述或当前答案是如何“rotate it by k times”的,其中“it”是给予数组,它们似乎都创建了一个新数组。
若要将数组循环k次,首先取k对数组长度取模,然后执行三个步骤(例如,{1, 2, 3, 4, 5}, k = 3):
反转零件直到索引k:

{3, 2, 1, 4, 5}

将零件从索引k反转到末尾:

{3, 2, 1, 5, 4}

反转整个阵列:

{4, 5, 1, 2, 3}

相关问题