题目
给定一个字符串,逐个翻转字符串中的每个单词。
说明:
无空格字符构成一个 单词 。
输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
思路:
本题在处理字符串前后空格的时候,可以直接使用库函数,因为这不是本题的重点。
本题的重点是把单词看作整体,反转整个字符串。
- 首先用库函数去字符串的首尾空格
- 然后将字符串转换成字符数组,用一个循环去除中间的多余空格。
- 最后创建一个新数组,用一个循环从后往前遍历原数组,遇到空格就把空格后面的整个单词放入新数组,然后加一个空格。
- 需要注意的地方是最后一个单词是不满足判断条件的,需要额外处理,以及最后一次不加空格也需要加一个判断。
源码
class Solution {
public String reverseWords(String s) {
s=s.trim();
char[] arr=s.toCharArray();
int i=0;
for(int j=0;j<arr.length;j++){//去除字符数组中多余的空格
if(arr[j]!=' '){
arr[i++]=arr[j];
}else{
arr[i++]=arr[j];
while(j<arr.length&&arr[j+1]==' '){
j++;
}
}
}
char[] arr1=new char[i];
int k=0;//一个单词的开始下标
int index=0;//新数组的下标
int stop=i;//一个单词的结束标记
for(int j=i-1;j>=0;j--){
if(arr[j]==' '){
k=j+1;
while(k<stop){
arr1[index]=arr[k];
index++;
k++;
}
stop=j;
if(index!=i){//特殊处理加空格
arr1[index++]=' ';
}
}
}
for(int m=0;m<stop;m++){//特殊处理最后一个单词
arr1[index++]=arr[m];
}
return new String(arr1);
}
}