234234234

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;
} 

 

posted @ 2024-05-10 16:45  你若愿意,我一定去  阅读(7)  评论(0编辑  收藏  举报
23423423423