zoukankan      html  css  js  c++  java
  • 编程之美2.17 数组循环移位

          这是一个非常经典的题目,题目的大概意思是这种:

          有一个存储字符串的数组,须要依照要求循环移动数组中的字符。比如,数组中存储字符 abcd1234。循环右移4位。之后,会得到这样一个字符数组 1234abcd。当然,左移也是相同的解法

          想想这个问题不是非常难,顺序依次移动就能够了。这样做的话,时间复杂度是O(n2)量级的。那么,有没有更快的方法呢?

          首先,我们须要对数组的前四位进行翻转(前面的样例)。得到dcba1234,之后。我们再对后4位进行翻转。得到dcba4321。最后。我们再对总体进行翻转。得到:1234abcd。就是这样,攻克了这个问题,因为翻转一个字符串须要的时间复杂度是O(n)。所以。该算法的时间复杂度是O(n)量级的。

          以下给出解决方法:      

    template <typename T>
    void DutCircleShift(T* A, int size, int k)
    {
    	k %= size;
    
    	DutReverse<T>(A, 0, size - k - 1);
    	DutReverse<T>(A, size - k, size - 1);
    	DutReverse<T>(A, 0, size - 1);
    }
    /*翻转函数*/
    template <typename T>
    void DutReverse(T* A, int low, int high)
    {
    	for (; low < high; ++low, --high)
    	{
    		T temp = A[low];
    		A[low] = A[high];
    		A[high] = temp;
     	}
    
    	return;
    }

          代码中的第一句代表假设输入的那个数(即循环移动的数字)大于数组的长度。那么,就对这个数依照数组长度取余。

  • 相关阅读:
    hdu 1017 A Mathematical Curiosity 解题报告
    hdu 2069 Coin Change 解题报告
    hut 1574 组合问题 解题报告
    hdu 2111 Saving HDU 解题报
    hut 1054 Jesse's Code 解题报告
    hdu1131 Count the Trees解题报告
    hdu 2159 FATE 解题报告
    hdu 1879 继续畅通工程 解题报告
    oracle的系统和对象权限
    oracle 自定义函数 返回一个表类型
  • 原文地址:https://www.cnblogs.com/blfbuaa/p/6957549.html
Copyright © 2011-2022 走看看