1008 数组元素循环右移问题 (20 分)

941 阅读1分钟

题目链接

  1. 循环右移和循环左移问题,不要真的去模拟循环移动这样开销大还麻烦。
  2. 通常都是采用三次反转即可,如题目例子的数列【1,2,3,4,5,6】,假设循环右移2个单位
    1. 先将后面两个反转,数列变成【1,2,3,4,6,5】
    2. 再将前面四个反转,数列变成【4,3,2,1,6,5】
    3. 最后再将整体进行反转。结果就变成【5,6,1,2,3,4】。 3.题目中给的M可能比N大,所以一定要先进行取余操作。

C++ 代码

#include <iostream>
#include<string>
#include<vector>
#include <map>
#include<math.h>
#include <algorithm>
using namespace std;

int main() {
	int n, right;
	cin >> n >> right;
	right = right % n;
	vector<int>res(n);
	for (int i = 0; i < n; i++) {
		cin >> res[i];
	}
	if (right) {
		reverse(res.begin(), res.end());
		reverse(res.begin(), res.begin() + right);
		reverse(res.begin() + right, res.end());
	}
	cout << res[0];
	for (int i = 1; i < res.size(); i++)
		cout << " " << res[i];
	cout << endl;
	return 0;
}

python代码

def main():
    a = input().split(' ')
    right = int(a[1])
    n = int(a[0])
    right = right%n
    res = input().split(' ')
    if(right != 0):
        res[-right:] = reversed(res[-right:])
        res[:n-right] = reversed(res[:n-right])
        res.reverse()

    for i,value in enumerate(res):
        if i!=0:
            print(" ",end='')
        print(res[i],end='')

main()