题目描述
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
示例 1:
输入: s = “abcdefg”, k = 2
输出: “cdefgab”
示例 2:
输入: s = “lrloseumgh”, k = 6
输出: “umghlrlose”
解题思路
我写的代码就很冗余,但是结果能得到,效率不高,思路就是下图的思路
方法一:字符串拼接
class Solution {
public String reverseLeftWords(String s, int n) {
char[] chars = s.toCharArray();
Character[] res = new Character[chars.length];
// System.out.println(res.length);
int j = chars.length - n;
for (int i = 0; i < chars.length; i++) {
if (i >= n){
res[i - n] = chars[i];
// System.out.println(Arrays.toString(res));
}else {
res[j] = chars[i];
// System.out.println(Arrays.toString(res));
if (j < chars.length - 1){
j++;
}
// System.out.println(j);
}
}
StringBuilder str = new StringBuilder();
for (Character re : res) {
str.append(re);
}
return str.toString();
}
}
方法二:直接利用字符串切片
public String reverseLeftWords_2(String s, int n) {
return s.substring(n,s.length()) + s.substring(0,n);
}
- 如果要求不能使用切片函数
方法三:列表遍历拼接
public String reverseLeftWords_3(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();
}
方法四:
(如果要求不能使用切片函数)
列表遍历拼接 + 求余运算 ————可以简化代码
public String reverseLeftWords_4(String s, int n) {
StringBuilder res = new StringBuilder();
for (int i = n; i < n + s.length(); i++) {
res.append(s.charAt(i % s.length()));
}
return res.toString();
}
以下方法三和方法四效率低下,因为字符串一旦生成,其内容是不能改变的
- 要求只能使用String
字符串遍历拼接
public String reverseLeftWords(String s, int n) {
String res = "";
for (int i = n; i < s.length(); i++) {
res += s.charAt(i);
}
for (int i = 0; i < n; i++) {
res += s.charAt(i);
}
return res;
}
列表遍历拼接 + 求余运算 ————可以简化代码
public String reverseLeftWords_6(String s, int n) {
String res = "";
for(int i = n; i < n + s.length(); i++)
res += s.charAt(i % s.length());
return res;
}