题目描述:
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
思路:笨的暴力解法:将需要的字符使用字符数组进行保存;使用StringBuilder将去掉字符的字符串更新;再将字符append到新的字符串上
知识点:关于字符串String、StringBuilder和StringBuffer有需要的原生api进行使用,感觉字符串相关的题,只要熟悉掌握的方法足够,就会有多样的解法。
新学到的字符串方法:1)subString(int i,int j):得到字符串的子字符串
取余思想:是数据结构中重要的思想。
手写代码:用到了大量的for循环,看答案怎么优化
class Solution {
public String reverseLeftWords(String s, int n) {
//用字符数组将需要截取的字符存起来
int size = s.length();
char[] array = new char[n];
StringBuilder sb = new StringBuilder();
for(int i = 0;i < n;i++){
array[i] = s.charAt(i);
}
//拿到去掉前面内容的字符串
for(int i = n;i < size;i++){
sb.append(s.charAt(i));
}
//把存起来的字符拼接到字符串上
for(int i = 0;i < array.length;i++){
sb.append(array[i]);
}
//String str = new String(sb);
return sb.toString();
}
}
答案分析:
作者:jyd
链接:https://leetcode-cn.com/problems/zuo-xuan-zhuan-zi-fu-chuan-lcof/solution/mian-shi-ti-58-ii-zuo-xuan-zhuan-zi-fu-chuan-qie-p/
来源:力扣(LeetCode)
1)字符串切片:切分成子字符串 subString(); 范围一般是左闭右开
class Solution {
public String reverseLeftWords(String s, int n) {
return s.substring(n, s.length()) + s.substring(0, n);
}
}
2)字符遍历拼接:将自己的代码优化,不需要字符数组;
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 < s.length(); i++)
res.append(s.charAt(i));
for(int i = 0; i < n; i++)
res.append(s.charAt(i));
return res.toString();
}
}
3)只使用String,可以使用 + 的拼接操作;取余可以优化
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;
}
}