网站救助计划
1.为阅读体验,本站无任何广告,也无任何盈利方法,站长一直在用爱发电,现濒临倒闭,希望有能力的同学能帮忙分担服务器成本
2.捐助10元及以上同学,可添加站长微信lurenzhang888,备注捐助,网站倒闭后可联系站长领取本站pdf内容
3.若网站能存活下来,后续将会持续更新内容
题目描述
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串”abcdefg”和数字2,该函数将返回左旋转两位得到的结果”cdefgab”。
示例 1:
输入: s = "abcdefg", k = 2
输出: "cdefgab"
示例 2:
输入: s = "lrloseumgh", k = 6
输出: "umghlrlose"
限制:
- 1 <= k < s.length <= 10000
算法
(模拟) O(n)
- 先翻转要左旋的部分(前一部分 [0, n – 1])
- 再翻转剩下的部分(后一部分 [n, end])
- 最后将整个字符串翻转
时间复杂度
整个字符串需要被翻转两次(整体翻转、翻转前一部分和后一部分),每次翻转的时间复杂度为 O(n),所以总的时间复杂度为 O(n)
空间复杂度
O(1)
C++ 代码
class Solution {
public:
string reverseLeftWords(string s, int n) {
reverse(s.begin(), s.end());
reverse(s.begin(), s.begin() + s.size() - n);
reverse(s.begin() + s.size() - n, s.end());
return s;
}
};
Java 代码
class Solution {
public String reverseLeftWords(String s, int n) {
char[] sArray = s.toCharArray();
reverse(sArray, 0, sArray.length - 1);
reverse(sArray, 0, sArray.length - n - 1);
reverse(sArray, sArray.length - n, sArray.length - 1);
return new String(sArray);
}
private void reverse(char[] arr, int left, int right) {
while (left < right) {
char temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
left++;
right--;
}
}
}
Python 代码
class Solution:
def reverseLeftWords(self, s: str, n: int) -> str:
s_list = list(s)
s_list.reverse()
s_list[:s_list.__len__() - n] = reversed(s_list[:s_list.__len__() - n])
s_list[s_list.__len__() - n:] = reversed(s_list[s_list.__len__() - n:])
return ''.join(s_list)
本文由读者提供,Github地址:https://github.com/tonngw
点击面试手册,获取本站面试手册PDF完整版