给定一个字符串,将后m个字符移到整个字符的前面

要求给出逐个位置移动,且时间复杂度为O(n)的算法

 

9.写代码环节

问题:给定一个字符串,将后m个字符移到整个字符的前面。例 str = "abcd12"  m=2,输出 “12abcd”

①.先写了一个最低级的双重for循环把最后m个字符依次和前面交换换到最前。时间复杂度O(mn)。面试官说需要优化一下

②.继续写了一个临时变量存后m个字符,然后把全部前面的字符从后往前直接覆盖到字符串尾部。时间复杂度O(n),空间复杂度O(m)。面试官说时间复杂度可以但是空间复杂度还不好

③.最后说思路,在m已知的情况下,每个字符的位置是已知的,就比如前面的字符,index为x那么新的字符串中它的index会变为x+m,这样就可以直接把每个字符都放到它们最终的位置,只需要固定的额外内存来存一个字符的备份以及其他变量。

此时时间复杂度O(n),空间复杂度O(1)。

(补充)关于上述两种情况何时出现:
其实是这样的,对于一个长度为 nn 的数组,整体移动 kk 个位置

当 nn 和 kk 的最大公约数 等于 1 的时候:1 次遍历就可以完成交换;比如 n = 5, k = 3n=5,k=3
当 nn 和 kk 的最大公约数 不等于 1 的时候:1 次遍历是无法完成的所有元素归位,需要 mm (最大公约数) 次
所以在最大公约数不为 1 的时候
比如 [A,B,C,D,E,F][A,B,C,D,E,F] 此时 n = 6 \ , k = 4n=6 ,k=4 ,其最大公

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值