要求给出逐个位置移动,且时间复杂度为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 ,其最大公

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



