数组循环左移

本题要求实现一个对数组进行循环左移的函数:一个数组a中存有n(>0)个整数,将每个整数循环向左移m(≥0)个位置。即将a中的数据由[a 0 ​ a 1 ​ ​...a n−1 ​ ]变换为[a m ​ ​a m+1 ​ ...a n−1 ​ ​a 0 ​ ​a 1 ​ ​...a m−1 ​ ](最前m个数循环移至最后面的m个位置)。 函数接口定义: void ArrayShift( int a[], int n, int m ); 其中a[]是用户传入的数组;n是数组的大小;m是左移的位数。函数ArrayShift须将循环左移后的数组元素仍然存放在a[]中。

void ArrayShift(int a[], int n, int m) {
    if (n <= 1 || m % n == 0) {  // 如果数组大小小于等于1或者移动位数取模等于0,则不需要移动,直接返回。
        return;
    }
    
    // 对移动位数取模,防止超出数组大小
    m %= n;
    
    reverse(a, a + m);          // 倒序前m个数
    reverse(a + m, a + n);      // 倒序后n-m个数
    reverse(a, a + n);          // 倒序整个数组
}

另一种方式是使用一个临时数组,将需要移动的元素先存储在临时数组中,然后将原数组中剩余的元素依次往左移动m个位置,最后再将临时数组中的元素放到数组的末尾m个位置上。

具体步骤如下:

  1. 判断特殊情况,如果数组大小小于等于1或者移动位数取模等于0,则不需要移动,直接返回。
  2. 对移动位数取模,防止超出数组大小。
  3. 创建一个长度为m的临时数组,将需要移动的元素存储在其中。
  4. 将原数组中剩余的元素依次往左移动m个位置。
  5. 将临时数组中的元素依次放到数组的末尾m个位置上。

以下是相应的代码:

void ArrayShift(int a[], int n, int m) {
    if (n <= 1 || m % n == 0) {  // 如果数组大小小于等于1或者移动位数取模等于0,则不需要移动,直接返回。
        return;
    }

    // 对移动位数取模,防止超出数组大小
    m %= n;
    
    int temp[m];                    // 创建临时数组
    for (int i = 0; i < m; i++) {   // 将需要移动的元素存储在临时数组中
        temp[i] = a[i];
    }
    for (int i = m; i < n; i++) {   // 将原数组中剩余的元素依次往左移动m个位置
        a[i-m] = a[i];
    }
    for (int i = 0; i < m; i++) {   // 将临时数组中的元素放到数组的末尾m个位置上
        a[n-m+i] = temp[i];
    }
}

这种方法需要使用额外的空间,所以在空间限制较为严格的情况下不太适用,但是移动过程比较直观易懂。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值