344. 反转字符串
分析:双指针反转即可
代码:
public void reverseString(char[] s) {
for(int i = 0, j = s.length - 1; i < j; i++, j--){
char temp = s[i];
s[i] = s[j];
s[j] = temp;
}
}
541. 反转字符串 II
分析:遍历字符串时,以每次2k进行遍历,进入循环后,判断当前i+k的索引是否越界,不越界则反转i到i+k段的字符串,最后操作i到s.length()段的字符串,此操作遵循左闭右开区间的规则,因此right取k - 1,且left不能取到区间的中值,最终代码如下。
代码:
public String reverseStr(String s, int k) {
char[] str = s.toCharArray();
for(int i = 0;i < str.length;i += 2 * k){
//处理i到i+K
if(i + k <= str.length){
reverse(str, i, i + k);
continue;
}
//处理i到s.length()末尾段
reverse(str, i, str.length);
}
return new String(str);
}
private void reverse(char[] str, int i, int k){
for(int left = i, right = k - 1;left < i + (k - i + 1)/2;left++, right--){
char temp = str[left];
str[left] = str[right];
str[right] = temp;
}
}
剑指 Offer 05. 替换空格
分析:很简单,遍历+替换
代码:
public String replaceSpace(String s) {
String temp = new String();
for(int i = 0; i < s.length(); i++){
if(s.charAt(i) == ' '){
temp += "%20";
}else{
temp += s.charAt(i);
}
}
return temp;
}
151. 反转字符串中的单词
分析:用栈来解决,首先将字符串用split做分割,注意Java中split分割空格后,会有""这种情况存在,如下图所示:
![](https://img-blog.csdnimg.cn/img_convert/65daf5f40efef8fa1698fd7d2a153927.png)
所以在遍历分割后的数组时,需要去除""的存在,否则会影响最后答案,最后将栈中元素弹出,做字符串拼接,注意当栈中只剩余一个元素时,不要在后面添加空格。
代码:
public String reverseWords(String s) {
Deque<String> stack = new ArrayDeque<>();
String[] s1 = s.split(" ");
for(int i = 0; i < s1.length; i++){
if(!"".equals(s1[i])){
stack.push(s1[i]);
}
}
String res = new String();
while(!stack.isEmpty()){
if(stack.size() == 1){
res += stack.pop();
}else{
res += stack.pop();
res += " ";
}
}
return res;
}
剑指 Offer 58 - II. 左旋转字符串
分析:分别记录0-n和n-s.length区间的字符串,最后相加即可得到答案。
代码:
public String reverseLeftWords(String s, int n) {
char[] s1 = s.toCharArray();
String temp = new String();
String temp2 = new String();
for(int i = 0; i < n; i++){
temp += s1[i];
}
for(int j = n; j < s.length();j++){
temp2 += s1[j];
}
return temp2 + temp;
}