PTA | 1008 数组元素循环右移问题 字符串翻转

121 阅读1分钟

PTA | 1008 数组元素循环右移问题

坑点: 当N-M大于N时,会输出错误,所以需要提前将m = m%n,或者使用数学库将N-M取绝对值再%N;

这道题要么开个辅助空间,利用栈或队列的特性来实现反转,要么就找规律原地翻转,如下:

C语言

image.png

#include<iostream>
using namespace std;

void reverse(int a[], int start, int end) {
for(int i = start; i <= (start + end) / 2; i++) {
    int temp = a[i];
    a[i] = a[start + end - i];
    a[start + end - i] = temp;
    }
} 

int main()
{
    int n=0,m=0;cin>>n>>m;
    m %= n;//m %= n,以确保m的值不会超过数组的大小。
    int a[n];
    for(int i=0;i<n;i++)scanf("%d",&a[i]);
   
        reverse(a, 0, n-m-1);
        reverse(a, n-m, n-1);
        reverse(a, 0, n-1);
        
    printf("%d", a[0]);
    for(int i=1; i < n; i++) {
    printf(" %d", a[i]);
    }
    printf("\n");

    return 0;
}

c++

#include<bits/stdc++.h>
using namespace std;

int main()
{
    int n,m;cin>>n>>m;vector<int>a(n);
    m%=n;  //为了防止要旋转的数超过了数组长度
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
    }

    reverse(begin(a),begin(a)+n);
    reverse(begin(a),begin(a)+m);
    reverse(begin(a)+m,begin(a)+n);

    for(int i=0;i<a.size();i++)
    {
        if(i)cout<<" "<<a[i];
        else cout<<a[i];
    }
        return 0;
}

画图举例:

初始状态: image.png

整体翻转:

image.png

翻转m位:

image.png

翻转剩下的n-m位:

image.png

完成翻转。