c语言 数据结构,把数据整体循环左(右)移p个位置
思路:n为数组的长度(利用线性代数的思路)
1.左移:把第1到第p个看成集合A,把第p+1到第n个看成集合B,则需要推导AB->BA, 过程(A-1)*(B-1)-> ( (A-1)*(B-1))-1 = BA
2.右移:把第1到第n-p个看成集合A,把第n-p+1到第n个看成集合B,则需要推导AB->BA, 过程(A-1)*(B-1)-> ( (A-1)*(B-1))-1 = BA
时间复杂度:O(n) , 空间复杂度O(1)
代码:
#include <stdio.h> // 在arr数组的n到m的位置数据进行倒置 void reverse(int * arr, int n, int m) { if (n >= m) { return; } int mid = n + (m - n) / 2; int cnt = m - n; for (int i = n; i <= mid; i++) { int num = arr[i]; arr[i] = arr[m - (i-n)]; arr[m - (i-n)] = num; } } int main() { int p; while(~scanf("%d", &p)) { int arr[] = {1,2,3,4,5,6}; int len = (sizeof(arr) / 4); // 取余,防止超出数组长度 p = p % len; // printf("p %d\n", p); // 开始循环移动 (向右) reverse(arr, 0, len-1-p); reverse(arr, len-p, len - 1); // 开始循环移动 (向左) //reverse(arr, 0, p-1); //reverse(arr, p, len - 1); reverse(arr, 0, len - 1); //printf("\n"); // 打印 for(int l = 0; l < len; l++) { printf("%d ", arr[l]); } printf("\n"); } return 0; }