板栗說算法 之 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;
}

 

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