面试的时候也碰见了这个问题,我当时采取的解决方案是把数组double,然后从length-k开始遍历length个字符。时间开销是O(2N) = O(N)
空间开销是O(2N) = O(N);
这个代码就不贴了,实现起来比较简单。
为了减少时间和空间的开销,我们还能有更好的解法么?
时间复杂度已经是线性了,这个开销已经不能再降低了,空间呢?
然后我考虑用大小为k的数组保存需要移位的数据,然后执行移位操作。考虑到当k>N的时候,只需要移位k%N即可。因此空间复杂度可以下降到O(N/2) = O(N)。仍然是线性的空间需求。有没有更好的解法?
编程珠玑和编程之美上面都提及了这个算法,让我自己想还真是想不出来,下面简单介绍之:
比如左右手均手心对着自己,左手在上,右手在下;如何使两只手的手心仍然对着自己,但是右手在上,左手在下呢?
1 先把左手的手背对着自己(1次翻转)
2 把右手的手背对着自己(两次翻转)
3 把两只手同时翻转(3次翻转)
完成了……
这种解法确实有点神奇,下面,贴代码: