推荐给好友 上一篇 | 下一篇

《编程之美》读书笔记(九):数组循环位移

2.17“数组循环位移”BSD爱好者乐园W;i8a8xQ

题目:设计一个算法,把一个含有N个元素的数组循环右移K位,要求时间复杂度为O(N),且只允许使用两个附加变量。BSD爱好者乐园Um]Q5F

2o)f _ZF V6OFs这个问题,我在面试中也问过,几乎所有的candidates都能给出解法一,至于解法二,并没有新意,读过STL源代码的人都知道:BSD爱好者乐园&w+H*\EPQ

U.uxIu/kL:]STL里面的rotate函数<algorithm>,就是用这种方法实现的

4Bo9@ @ _pUv9z

-jg(])r.m5qtemplate<class _BidIt> inline
k3f(aUH+b    void _Rotate(_BidIt _First, _BidIt _Mid, _BidIt _Last,   bidirectional_iterator_tag)
;G)[F-lu    {   BSD爱好者乐园]!MQ8IL4V1y-w
        std::reverse(_First, _Mid);BSD爱好者乐园5w3I;Zq D+G-M
        std::reverse(_Mid, _Last);
+?7j&g$[,_`        std::reverse(_First, _Last);
CJ2NDE(e!pD6Rk    }

eu sW8Qz1A

:T h;R Mb:e*[6J BSD爱好者乐园8XfFG_BFO$Z

BSD爱好者乐园2s4c]7O/B0pH

但是,STL只是在一个数组里面移位,所移动的长度不会超过数组的大小。如果一个长度是3的数组循环右移1000000位,也就是 K >> N的时候

T%n-q5AB'p G%y{ O"X(wBSD爱好者乐园UgaC5\ I

RightShift(int* arr, int N, int k)

Q sx$[$R

3zS2p9u&Wvq{BSD爱好者乐园2z1efw5HI:vN

L n3j2S&S5IH/Gt*}K %= N ; //很简单但是不同反响的一句

P v;N!\f&Ii8o|*H cBSD爱好者乐园LJEYf?,B:o pH

..........BSD爱好者乐园JtAu$|7i$I%l%\N4j

)DN.C om j]a0N3TtD}

m;BQ|"Z?Ta \|

[版权声明]BSD爱好者乐园站内文章,如来源不是互联网,则均系原创或翻译之作,可随意转载,或以此为基础进行演译,但务必以链接形式注明原始出处和作者信息,否则属于侵权行为。另对本站转载他处文章,俱有说明,如有侵权请联系本人,本人将会在第一时间删除侵权文章。
TAG: 编程之美 读书笔记
 

评分:0

我来说两句

seccode