思路理清楚就行:
既然不能定义另一个数组,那就把我们存储数据的数组扩大两倍,向后移也就是下标的移动。而且观察得出,移动M位,实际是移了(M % N)位。
1.将数组下标向后移动(M % N)位
2.将超出下标N - 1的数,赋值给数组前面(相当于移动到前面)。为了移动方便,可以定义一个(M %N)== 0时,直接输出数组。
C++版本
#include <bits/stdc++.h> using namespace std; int main() { int N, M, k; int *ptr; cin >> N; cin >> M; ptr = new int[2 * N](); for (int i = 0; i < N; ++i) { cin >> ptr[i]; } k = M % N;//计算移动位数 if (0 == k) {//k等于0时直接输出 for (int i = 0; i < N; ++i) { cout << ptr[i]; if (i != N - 1) cout << " "; } return 0; } for (int m = N - 1; m >= 0; --m) {//向后移动 ptr[m + k] = ptr[m]; } for (int j = 0; j < k; ++j) {//超出N-1部分,放前面 ptr[j] = ptr[N + j]; } for (int i = 0; i < N; ++i) {//输出 cout << ptr[i]; if (i != N - 1) cout << " "; } delete[] ptr; return 0; }
C语言版本:
#include <stdio.h> #include <stdlib.h> #include <string.h> #pragma warning(disable:4996) int main() { int N, M, k, n, j, m, i; int *ptr; scanf("%d%d", &N, &M); ptr = (int*)malloc(sizeof(int) * 2 * N); memset(ptr, 0, 2 * N); for (int i = 0; i < N; ++i) { scanf("%d", &ptr[i]); } k = M % N;//计算移动位数 if (0 == k) {//k等于0时直接输出 for (i = 0; i < N; ++i) { printf("%d", ptr[i]); if (i != N - 1) printf(" "); } return 0; } for (m = N - 1; m >= 0; --m) {//向后移动 ptr[m + k] = ptr[m]; } for (j = 0; j < k; ++j) {//超出N-1部分,放前面 ptr[j] = ptr[N + j]; } for (n = 0; n < N; ++n) {//输出 printf("%d", ptr[n]); if (n != N - 1) printf(" "); } return 0; }
那个#pragma...VS需要,这个C版的编译速度更快了,C确实底层。