PAT乙級1008

1008 數組元素循環右移問題 (20分)

題目地址:https://pintia.cn/problem-sets/994805260223102976/problems/994805316250615808ios

輸入格式:

每一個輸入包含一個測試用例,第1行輸入N(1≤N≤100)和M(≥0);第2行輸入N個整數,之間用空格分隔。數組

輸出格式:

在一行中輸出循環右移M位之後的整數序列,之間用空格分隔,序列結尾不能有多餘空格。測試

輸入樣例

6 2
1 2 3 4 5 6

輸出樣例

5 6 1 2 3 4

個人理解

出看題目,還在想移動數組位置,循環右移,即向右移動的過程當中,超過數組邊界的元素從元素左邊補上。中間想着用臨時變量保存被覆蓋的元素,但是想着想着就出現了另外數組的身影、、、。可也正是題目的要求不容許使用另外的數組,可這該怎麼辦呢?靈機一動,其實不必真的移動元素,只要表現起來像是移動了就能夠了。稍微的「欺騙」一下計算機。只須要首先輸出第n-m個元素到第n個元素,而後再輸出第0個到第n-m個元素便可。
spa

也能夠將右移後的元素的新的下標和以前的下標作個映射。反正訪問的時候進行處理就行了,表現出來就像是右移了。邏輯映射處理爲 index += n - m 。
code

代碼段

#include<iostream>
using namespace std;
int main() {
    int n = 0;
    int m = 0;
    cin >> n >> m;
    int number[n];
    for (int i = 0; i < n; i++) {
        cin >> number[i];
    }
    // 若是右移的量比較大,甚至發生了循環了一遍一遍又一遍,此時對右移的量進行處理,使其在一遍循環以內
    m %= n;
    for (int i = n - m; i < n; i++) {
        cout << number[i] << " ";
    }
    for (int i = 0; i < n - m; i++) {
        if (i != n - m - 1) {
            cout << number[i] << " ";   
        } else {
            cout << number[i];
        }
    }
    cout << endl;
    return 0;
}
相關文章
相關標籤/搜索