旋转数组
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。
比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
示例 1:
输入: s = "abcdefg", k = 2
输出: "cdefgab"
示例 2:
输入: s = "lrloseumgh", k = 6
输出: "umghlrlose"
限制:
1 <= k < s.length <= 10000
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/zuo-xuan-zhuan-zi-fu-chuan-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
自己的代码
class Solution {
public String reverseLeftWords(String s, int n) {
return s.substring(n) + s.substring(0,n);
}
}
这个题目就是对于字符串进行操作,所以需要对于字符串的裁剪,拼接这些常用函数比较熟悉。
str.substring(int beginIndex, int endIndex)
- 截取 [beginIndex, endIndex) 的闭开区间(注意索引值从0开始);
- 若只传入 beginIndex,将字符串从索引号为beginIndex开始截取,一直到字符串末尾;
- 根据某个字符作为字符串截取标志
String sb = "53285964@qq.com";
String str = sb.substring(0, sb.indexOf("@"));
System.out.println(str); // 结果:53285964
// indexOf(String str)方法返回的是子字符串第一次出现在字符串的索引位置
// 上面的代码返回的是@前面的字符。
其他思路
空间换时间
我们用 s + s 拼成一个两倍长度的字符串, 这样s[k:n + k] 就是我们要求的结果。
这个方法的缺点就是多占据了一倍的空间。时空复杂度都是 O(N)
python3 代码
- 首先解释一下,系统给出的模板是什么意思。
def reverseLeftWords(self, s: str, k: int) -> str:
- 函数注释包括参数注释(
:
)和返回值注释(->
)。意思是 s 需要的类型是 str,k 需要的类型是 int。最后的-> int
代表返回值是 str 类型。 - 这是python3引入的新特性,更加详细的内容链接
class Solution:
def reverseLeftWords(self, s: str, k: int) -> str:
n = len(s)
s = s + s
return s[k:n + k]
作者:fe-lucifer
链接:https://leetcode-cn.com/problems/zuo-xuan-zhuan-zi-fu-chuan-lcof/solution/chao-jian-dan-duo-chong-jie-fa-python3-by-azl39798/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
取模法
针对上面多占据了一倍空间的方法,我们可以虚拟的接上一个新字符串,也就是使用取模的方法进行循环。
时间复杂度为 O(N);空间复杂度为 O(1)
class Solution:
def reverseLeftWords(self, s: str, k: int) -> str:
n = len(s)
res = ''
for i in range(k, k + n):
res += s[i % n]
return res
作者:fe-lucifer
链接:https://leetcode-cn.com/problems/zuo-xuan-zhuan-zi-fu-chuan-lcof/solution/chao-jian-dan-duo-chong-jie-fa-python3-by-azl39798/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
C语言版本
C语言的执行速度和内存会更胜一筹。下面放一个参考代码。
char* reverseLeftWords(char* s, int n){
int len = strlen(s),i = 0;
char *ans = malloc(sizeof(char) * (len + 1));
while(i < len){
*(ans++) = s[(n + i++)%len]; // 使用了上面的取模方法解决的,尤其注意优先级!
}
*ans= ' ';
return ans - len;
}
作者:ning-junzhi
链接:https://leetcode-cn.com/problems/zuo-xuan-zhuan-zi-fu-chuan-lcof/solution/cjian-dan-yi-dong-de-jie-fa-by-ning-junzhi/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
char* reverseLeftWords(char* s, int n){
int len = strlen(s), k = 0;
char *res = malloc((len+1)*sizeof(char)); // 新建一个长度 len+1 的内存空间res,类型为char
char *p = s + n; // 指针p指向 s+n 位置
for(int i = 0; i < len - n; i++){
res[k++] = p[i]; // 把指针p之后的内容先放到 res 中
}
for(int i = 0; i < n; i++){
res[k++] = s[i]; // 将s的头部内容放入 res 中
}
res[k] = ' '; // res 最后一位置为结束标志
return res;
}
作者:newpp
链接:https://leetcode-cn.com/problems/zuo-xuan-zhuan-zi-fu-chuan-lcof/solution/cjie-fa-li-yong-xin-zhi-zhen-ding-wei-shuang-100-b/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。