PTA_乙级_1008

PTA_乙级_1008_第1张图片
首先,它翻转前部分(0 到 N-M-1)。
然后,它翻转后部分(N-M 到 N-1)。
最后,它整体翻转整个数组(0 到 N-1)

#include
using namespace std;

// 反转数组的指定范围
void reverseArray(int arr[], int start, int end) {
    while (start < end) {
        swap(arr[start], arr[end]);
        start++;
        end--;
    }
}

// 循环向右移动数组的数据
void rotateArrayRight(int arr[], int N, int M) {
    if (N <= 0 || M < 0 ) {
        return; // 无需移动
    }

    // 翻转前部分 (0 到 N-M-1)
    reverseArray(arr, 0, N - M - 1);

    // 翻转后部分 (N-M 到 N-1)
    reverseArray(arr, N - M, N - 1);

    // 整体翻转 (0 到 N-1)
    reverseArray(arr, 0, N - 1);
}

int main(){
    int n,m;
    cin>>n>>m;
    
    if(m>=n){
        m%=n;
    }
    int a[n];
    
    for(int i=0;i<n;i++)
        a[i]=0;
    
    for(int i=0;i<n;i++)
        cin>>a[i];
    
    rotateArrayRight(a, n, m);
    
    for(int i=0;i<n;i++){
        cout<<a[i];
        if(i!=n-1)
            cout<<" ";
    }
    return 0;
}

需要注意M可能会大于N,这个时候要进行取余操作
if(m>=n){
m%=n;
}

同样的题型还有循环左移

#include
using namespace std;

// 反转数组的指定范围
void reverseArray(int arr[], int start, int end) {
    while (start < end) {
        swap(arr[start], arr[end]);
        start++;
        end--;
    }
}

// 循环向右移动数组的数据
void rotateArrayRight(int arr[], int N, int M) {
    if (N <= 0 || M < 0 ) {
        return; // 无需移动
    }

    // 翻转前部分 (0 到 M-1)
    reverseArray(arr, 0, M - 1);

    // 翻转后部分 (M 到 N-1)
    reverseArray(arr, M, N - 1);

    // 整体翻转 (0 到 N-1)
    reverseArray(arr, 0, N - 1);
}

int main(){
    int n,m;
    cin>>n>>m;
    
    if(m>=n){
        m%=n;
    }
    int a[n];
    
    for(int i=0;i<n;i++)
        a[i]=0;
    
    for(int i=0;i<n;i++)
        cin>>a[i];
    
    rotateArrayRight(a, n, m);
    
    for(int i=0;i<n;i++){
        cout<<a[i];
        if(i!=n-1)
            cout<<" ";
    }
    return 0;
}

你可能感兴趣的:(PTA乙级,算法,c++)