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

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

  • 相关阅读:
    第5章 css与背景相关的样式background
    第4章 css文字text与字体font-face
    第3章 css属性color的RGBA值
    第2章 css边框属性
    第1章 初识CSS3
    CSS单行、多行文本溢出显示省略号(……)解决方案
    Access-Control-Allow-Origin实现跨域访问 跨域
    Mysql主数据库+备份数据库部署教程
    PHP 数据安全问题总结
    PHP redis 批量操作
  • 原文地址:https://www.cnblogs.com/blfbuaa/p/6957549.html
Copyright © 2011-2022 走看看