题目
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
我的方法:
没看清题目,最开始取模有点多余了。因为k是小于s的长度了。
class Solution {
public String reverseLeftWords(String s, int n) {
int l=n%s.length();
StringBuilder re=new StringBuilder();
for(int i=l;i<s.length();i++){
re.append(s.charAt(i));
}
for(int i=0;i<l;i++)
{
re.append(s.charAt(i));
}
return re.toString();
}
}
方法一:字符串切片
新建两切片字符串,并将两切片拼接为结果字符串,无冗余操作,效率最高。
class Solution {
public String reverseLeftWords(String s, int n) {
return s.substring(n, s.length()) + s.substring(0, n);
}
}
方法二:列表遍历拼接
StringBuilder是可变对象,每轮遍历拼接字符时,只是向列表尾部添加一个新的字符元素。最终拼接转化为字符串时,系统 仅申请一次内存
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();
}
其实上面这个就是我用的方法,然后看到了一个很妙的办法简化代码。
利用取余数简化代码:
class Solution {
public String reverseLeftWords(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();
}
}
方法三:字符串遍历拼接
Java 中,字符串是 “不可变对象” 。因此,每轮遍历拼接字符时,都需要新建一个字符串;因此,系统 需申请 NN 次内存 ,数据量较大时效率低下。
class Solution {
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;
}
}
同理用求余的方法优化代码
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;
}
}