给定一个字符串,逐个翻转字符串中的每个单词。
说明:
无空格字符构成一个单词。
输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
进阶:
请选用 C 语言的用户尝试使用 O(1) 额外空间复杂度的原地解法。
自己写的有些复杂,没有优化。先首尾空字符去掉,然后整个字符串反转,再对每个字符串反转。
public class Main {
public static String reverseWords(String s) {
if(s.equals("")||s.equals(" "))return "";
StringBuffer str = new StringBuffer(s);
int a = 0;
//若第一个字符串为空字符串,删除。
while(str.charAt(a) == ' ' && str.length() > 0 ) {
str.deleteCharAt(a);
if(str.length() == 0) return ""; //删到长度为0的时候返回
}
//对字符串后面的空字符进行删除
int b = str.length()-1;
while(str.charAt(b) == ' ' && b > 0 ) {
str.deleteCharAt(b);
b=str.length()-1; //每次都对最后一个位子进行判断
}
//整个字符串反转
for( int i=0,j=str.length()-1;i < j ; i++,j--) {
char c = str.charAt(i);
str.setCharAt(i,str.charAt(j) );
str.setCharAt(j,c);
}
//对字符串中 出现多个空字符串的地方进行删除,只保留一个
for(int i=0;i<str.length()-2;) {
//连续两个为空字符,删去本位子的字符
if(str.charAt(i) == ' '&& str.charAt(i+1)==' ')
{
str.deleteCharAt(i);
continue;
}
//当出现不是空字符串的时候 位子+1
i++;
}
//对内部每个字符串进行反转。
int l = 0; //记录内部字符串长度
for(int i=0;i<str.length();i++) {
if(str.charAt(i) != ' ') { //一个内部字符串长度
l++;
}else {
//内部字符串长度大于1 则进行反转。
if(l>1) {
//对相应位子进行置换
for(int j= i-l,k=i-1; j<k;j++,k--) {
char c = str.charAt(j);
str.setCharAt(j,str.charAt(k) );
str.setCharAt(k,c);
}
}
//操作完一个内部字符串 则长度置为0
l = 0;
}
}
//上面代码对 if(str.charAt(i) != ' ') else时候对上一个内部字符串操作,因此最后一个内部串没有操作,所以对最后一个内部字符串置换。
for(int i=str.length()-l,j=str.length()-1;i<j;i++,j--) {
char c = str.charAt(i);
str.setCharAt(i,str.charAt(j) );
str.setCharAt(j,c);
}
System.out.print(str.toString());
return str.toString();
}
public static void main(String[] args) {
reverseWords("123 123");
}
}