第 2 章 第 3 题 数组旋转问题 翻转算法实现

问题分析

  输入:目标数组,旋转位数。

  处理:将目标数组旋转指定的位数。

  约束:无

解答思路

  将对象数组拆分成 a b 两个部分:a 表示要移动到尾端的部分 b表示要移动到前端的部分。

  根据翻转算法的思想,可以按如下步骤完成旋转操作:

  1. 将 a 部分逆置

  2. 将 b 部分逆置

  3. 将整个数组逆置

代码实现

#include <iostream>

using namespace std;

// 数组旋转函数
void rotate(int *array, int n, int r);
// 逆置函数
void reverse(int *array, int n);

int main(void)
{
    // 建立并初始化,输出测试数组。
    int array[10];
    int n=10;
    for (int i=0; i<10; i++) {
        array[i] = i+1;
    }
    cout << "目标数组:" << endl;
    for (int i=0; i<10; i++) {
        cout << array[i] << " ";
    }
    cout << endl;

    // 获取旋转位数
    int r;
    cout << "旋转位数:";
    cin >> r;

    // 处理旋转位数
    if (r<0) {
        cout << "非法的旋转位数" << endl;
        return 0;
    }
    else
        r %= n;

    // 调用数组旋转函数
    rotate(array, n, r);

    // 打印旋转结果
    cout << endl << "旋转后的数组:" << endl;
    for (int i=0; i<10; i++) {
        cout << array[i] << " ";
    }
    cout << endl;

    return 0;
}
    
void rotate(int *array, int n, int r) {
    // 翻转 a 部分
    reverse(array, r);
    // 翻转 b 部分
    reverse(array+r, n-r);
    // 翻转对象数组
    reverse(array, n);
}

void reverse(int *array, int n) {
    int tem = 0;
    for (int i=0; i<=(n-1)/2; i++) {
        tem = array[i];
        array[i] = array[n-i-1];
        array[n-i-1] = tem;
    }
}

小结

  这是数组翻转操作中最经典最常用的一个算法,应熟练掌握之。

转载于:https://www.cnblogs.com/scut-fm/p/3639186.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值