思路:先将整个数组reverse,然后遍历数组识别出每个单词,再将每一个单词reverse。由于这边要in-place ,不能用extra space。所以我们reverse的策略就是头尾互换,由头尾向中间推进。很简单,直接给出代码:
class Solution {
public void reverse(char[] s, int left, int right) {
while(left < right){
char tmp = s[left];
s[left] = s[right];
s[right] = tmp;
left++;
right--;
}
}
public void reverseEachWord(char[] s){
int pre = 0;
for(int i = 0; i < s.length; i++){
if(i == s.length-1){
reverse(s,pre,i);
}
if(s[i] == ' '){
reverse(s,pre,i-1);
pre = i+1;
}
}
}
public void reverseWords(char[] s) {
reverse(s,0,s.length-1);
reverseEachWord(s);
}
}
总结:
- 和151题很像,但是这题不需要考虑那些乱七八糟的空格问题,可以合在一起看。