博客链接: Coding Lemon’s blog Java知识、面试总结、LeetCode题目解析等持续更新
题目描述
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"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
这道题本身非常简单,如果用substring方法一行代码就可以解决,但是要理解其中原理。代码如下:
解题思路一
public String reverseLeftWords(String s, int n) {
return s.substring(n)+s.substring(0,n);
}
提交到LeetCode的运行结果如下:
解题思路二
在LeetCode上有这样一行代码,个人感觉比较有意思:
public String reverseLeftWords(String s, int n) {
return (s+s).substring(n,n+s.length());
}
提交到LeetCode的运行结果如下:
这个解题思路可能与常人思维不太一样,可以参考。
解题思路三
如果不能直接用字符串拼接的方法,可以尝试使用字符拼接的方式进行操作,代码如下:
class Solution {
public String reverseLeftWords(String s, int n) {
String res = "";
for(int i = n; i < n + s.length(); i++)
res += s.charAt(i % s.length());
return res;
}
}
算法原理
看到题目,这里第一时间联想到的是单项队列的原理,如果例用纯算法思想,将字符串中每个字符从一端存入队列中,将前n个字符依次从另一端取出后再依次存入队列中即可。图解如下: