编程之美--数组循环移位

面试的时候也碰见了这个问题,我当时采取的解决方案是把数组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次翻转)

完成了……

 

这种解法确实有点神奇,下面,贴代码:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值