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

    小结

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

  • 相关阅读:
    Android Service 服务(一)—— Service
    ostringstream的使用方法
    【Android动画】之Tween动画 (渐变、缩放、位移、旋转)
    #pragma comment
    添加PDF文件对照度的粗浅原理,及方法
    Jenkins(二)
    “简密”App Store处女作开发总结
    Windows下FFmpeg高速入门
    Storm-0.9.2-incubating源代码编译打包
    几种开源分词工具的比較
  • 原文地址:https://www.cnblogs.com/scut-fm/p/3639186.html
Copyright © 2020-2023  润新知