板栗说算法 之 PAT 乙级 1008 数组元素循环右移问题(全方面解析)

一、题目

一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A​0​​A​1​​⋯A​N−1​​)变换为(A​N−M​​⋯A​N−1​​A​0​​A​1​​⋯A​N−M−1​​)(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?

输入格式:

每个输入包含一个测试用例,第1行输入N(1≤N≤100)和M(≥0);第2行输入N个整数,之间用空格分隔。

输出格式:

在一行中输出循环右移M位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。

输入样例:

6 2
1 2 3 4 5 6

输出样例:

5 6 1 2 3 4

二、思路 

1.题中说不能使用第二个数组,那么我们可以将原本使用两个数组进行右移的思想放到一个数组里,用户输入MAX个数,向右偏移much个位置。那我们就创建能容纳(MAX+much)个数的数组。

2.录入用户输入的数

3.每个数从后往前的数往后移动much位,也就是array[i + much] = array[i].

4.超过MAX-1的数都放在前面。

三、代码实现 

#include <iostream>
using namespace std;

int main()
{
    //几位数
    int MAX;
    cin >> MAX;
    
    //往右移动几位
    int much;
    cin >> much;
    
    int * array = new int[MAX+much];
    
    //循环录入
    for(int i = 0; i < MAX; i++)
    {
        cin >> array[i];
    }
    
    //遍历后移
    for(int i = MAX-1; i >=0; i--)
    {
        array[i+much] = array[i];
    }
    
    //超过MAX-1的数往数组头移动
    for(int i = much - 1,j = MAX+much-1; i >= 0; i--,j--)
    {
        array[i] = array[j];
    }
    
    //按格式打印
    for(int i = 0; i < MAX; i++)
    {
        cout << array[i];
        if(i != MAX - 1)
        {
            cout << " ";
        }
        
    }
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章