首页 > 其他 > 详细

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

时间:2014-04-02 08:29:15      阅读:413      评论:0      收藏:0      [点我收藏+]

问题分析

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

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

  约束:无

解答思路

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

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

  1. 将 a 部分逆置

  2. 将 b 部分逆置

  3. 将整个数组逆置

代码实现

bubuko.com,布布扣
#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;
    }
}
bubuko.com,布布扣

小结

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

第 2 章 第 3 题 数组旋转问题 翻转算法实现,布布扣,bubuko.com

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

原文:http://www.cnblogs.com/scut-fm/p/3639186.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!