Problem description:
Given an input string , reverse the string word by word.
Example:
Input: ["t","h","e"," ","s","k","y"," ","i","s"," ","b","l","u","e"]
inter : ["e","u","l","b"," ","s","i"," ","y","k","s"," ","e","h","t"]
Output: ["b","l","u","e"," ","i","s"," ","s","k","y"," ","t","h","e"]
Note:
- A word is defined as a sequence of non-space characters.
- The input string does not contain leading or trailing spaces.
- The words are always separated by a single space.
Follow up: Could you do it in-place without allocating extra space?
题解:
分为两步解决此问题,第一不是单词的颠倒,第二步是单词内的颠倒。
时间复杂度:O(n), 空间复杂度O(1)
1 class Solution { 2 public void reverseWords(char[] str) { 3 int i = 0, j = str.length - 1; 4 while(i < j) { 5 swap(str, i++, j--); 6 } 7 for(i = 0; i < str.length; i++) { 8 if(str[i] == ' ') continue; 9 j = i; 10 while(j < str.length) { 11 if(str[j] == ' ') { 12 break; 13 } 14 j++; 15 } 16 int s = i, t = j - 1; 17 while(s < t) { 18 swap(str, s++, t--); 19 } 20 i = j; 21 } 22 23 } 24 private void swap(char[] str, int i, int j) { 25 char tmp = str[i]; 26 str[i] = str[j]; 27 str[j] = tmp; 28 } 29 }