给定一个字符串,要求把字符串前面的若干字符移动到字符串尾部。
解法一:蛮力法
首先想考虑将一个字符移到尾部的方法。代码如下:
void LeftShiftOne(char* s, int n) { char t = s[0]; for (int i = 1; i != n; i++) s[i - 1] = s[i]; s[n - 1] = t; }
如果要移动m个字符串,则依次对函数LeftShiftOne执行m次即可。代码如下:
void LeftRotateString(char* s, int n, int m) { while (m--) LeftShiftOne(s, n); }
时间复杂度:将一个字符移动到尾部需要n次操作,如果要移动m个字符,则需要操作m * n次。所以时间复杂度为O(m * n)
空间复杂度:O(1)
解法二:三步反转法
将一个字符串分为2个部分,一部分为m个需要旋转的字符记为X(abc),另一部分后半部分为n - m个字符记为Y(defg)。将X,Y反转。得到(cba)(gfed),之后将(cba)(gfed)整体反转得到(defgabc)。相当巧妙的算法。代码如下:
void ReverseString(char* s, int left, int right) { while (left < right) swap(s[left++], s[right--]); } void LeftRotateString(char* s, int n, int m) { ReverseString(s, 0, m - 1); ReverseString(s, m, n - 1); ReverseString(s, 0, n - 1); }
时间复杂度:每移动2个字符则要进行1次交换,所以时间复杂度正比与字符串的总数O(n)
空间复杂度:O(1)
举一反三
1. 链表反转。给定一个链表和一个数k
时间: 2024-12-21 11:46:11