大家好呀,我是喜欢旋儿一个的蛋蛋。
今天来搞左旋转字符串,光看题目觉的可能是道挺狠的题。
其实就是纸老虎,不禁打,直接搞起!
剑指 Offer-Ⅱ:左旋转字符串
题意
实现一个字符串左旋转操作。
左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。
示例
输入:s = “abcdefg”, k = 2
输出:“cdefgab”
提示
1 <= k < s.length <= 10000
题目解析
水题,难度简单,其实看懂题就会了。
所有的代码尽量都是自己写的,不要用编程语言自带的库函数。
还是想重复,对于字符串这部分,前期刷题所有的操作最好都是自己老老实实实现的。
再回到这道理,其实就是遍历列表,拆开,然后重新拼接的过程:
这个过程维护一个列表。
- 先将 k+1 到末尾的字符添加到列表中。
- 再将 0 到 k 的字符添加到列表中。
图解
在这以 s = “abcdefg”, k = 2 为例,首先初始化一个列表:
此例 k = 2,那根据题目解析中说的,先将 k+1 到末尾的添加到 res 中。
之后将 0 至 k-1 的字符添加至末尾。
本题的解题方法从左至右遍历整个字符串,所以时间复杂度为 O(n)。
时间复杂度还是按照你用的编程语言来算,如果字符串可修改的编程语言,比如 Python、Java,需要维护一个新的列表,这个的空间复杂度为 O(n),像可原地修改字符串的编程语言,比如 C++,这样的空间复杂度为 O(1)。
代码实现
Python 代码实现
class Solution:
def reverseLeftWords(self, s: str, n: int) -> str:
# python 字符串不可修改,所以维护一个列表
res = []
# 首先添加 n+1 到 len(s) 的元素
for i in range(n, len(s)):
res.append(s[i])
# 再添加 0 到 n 的元素
for i in range(n):
res.append(s[i])
return ''.join(res)
Java 代码实现
class Solution {
public String reverseLeftWords(String s, int n) {
StringBuilder res = new StringBuilder();
for(int i = n; i < s.length(); i++)
res.append(s.charAt(i));
for(int i = 0; i < n; i++)
res.append(s.charAt(i));
return res.toString();
}
}
好啦,图解左旋转字符串到这就结束辣。
你看像这种看起来花里胡哨的题目,完全不用慌,都是小猫咪。

最后记得帮我点赞呀,么么哒。
我是帅蛋,我们下次见。
推荐阅读 👍:ACM 选手图解 LeetCode 反转字符串