1. 翻转字符串里的单词
分为以下几个步骤
- 去除多余空格
- 翻转整个字符串
- 翻转每个单词
要注意以下细节:
- 去除空格:用快慢指针法,首先快指针去除空格,在所有非空格位置进行处理。然后首先加空格。慢指针在除了第一个单词之前加上空格。**这样保证单词间有空格且在每个单词前。**加完空格就快慢指针把单词加进去,循环就可以了。
- 翻转整个字符串:参数要设置开头结尾的位置,因为下面的函数要用
- 翻转每个单词:也是快慢指针,快指针的判断条件是
for(int end = 0; end <= chars.length; end++){
if(end == chars.length || chars[end] == ' '){
reverse(chars,start,end -1);
start = end + 1;
}
}
因为要处理的是start到end前面一个,所以最外层要加=。
class Solution {
public String reverseWords(String s) {
char[] chars = s.toCharArray();
chars = removeExtraSpaces(chars);
reverse(chars,0,chars.length - 1);
reverseEachWord(chars);
return new String(chars);
}
public char[] removeExtraSpaces(char[] chars){
int slow = 0;
for(int fast = 0;fast < chars.length; fast++){
if(chars[fast] != ' '){
if(slow != 0){
chars[slow++] = ' ';
}
while(fast < chars.length && chars[fast] != ' '){
chars[slow++] = chars[fast++];
}
}
}
char[] newChars = new char[slow];
System.arraycopy(chars,0,newChars,0,slow);
return newChars;
}
public void reverse(char[] chars, int start, int end){
for(; start <= end; start++,end--){
char temp = chars[start];
chars[start] = chars[end];
chars[end] = temp;
}
}
public void reverseEachWord(char[] chars){
int start = 0;
for(int end = 0; end <= chars.length; end++){
if(end == chars.length || chars[end] == ' '){
reverse(chars,start,end -1);
start = end + 1;
}
}
}
}
2. 右旋字符串
在原位置操作,先整体翻转,然后翻转前n个,再翻转后len-n个。
import java.util.Scanner;
public class Main{
public static String rotateString(int n, String str){
char[] chars = str.toCharArray();
reverse(chars,0, chars.length - 1);
reverse(chars,0, n - 1);
reverse(chars, n, chars.length - 1);
return new String(chars);
}
public static void reverse(char[] chars, int start, int end){
for(;start < end; start++, end--){
char temp = chars[start];
chars[start] = chars[end];
chars[end] = temp;
}
}
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = Integer.parseInt(sc.nextLine());
String str = sc.next();
String s = rotateString(n,str);
System.out.println(s);
}
}

被折叠的 条评论
为什么被折叠?



