给定一串字符串,反转每个单词的顺序,但是各个单词在字符串中的顺序不变,同时保留空格。
思路:
根据语言中字符串可变或不可变的情况,可以分成开辟或不开辟额外空间两种情况。
开辟一个新字符串。然后从头到尾遍历原字符串,直到找到空格为止,此时找到了一个单词,并能得到单词的起止位置。随后,根据单词的起止位置,可以将该单词逆序放到新字符串当中。如此循环多次,直到遍历完原字符串,就能得到翻转后的结果。这个方法对字符串可变或不可变的情况均适用。
直接在原字符串上进行操作,避免额外的空间开销。当找到一个单词的时候,交换字符串第一个字符与倒数第一个字符,随后交换第二个字符与倒数第二个字符……如此反复,就可以在原空间上翻转单词。这种解法称为原地解法,只适用于字符串时可变的语言。
public String reverseWords(String s) {
int left = 0, right = s.length() - 1;
char[] arr = s.toCharArray();
while (left <= right) {
int len = left;
while (len <= right && arr[len] != ' ') {
len++;
}
reverse(arr, left, len - 1);
// 处理单词后面存在多个空格的情况
while (len <= right && arr[len] == ' ') {
len++;
}
left = len;
}
return new String(arr);
}
public void reverse(char[] arr, int start, int end) {
while (start < end) {
char temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
start++;
end--;
}
}