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 @   你若愿意,我一定去  阅读(152)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
23423423423
点击右上角即可分享
微信分享提示