https://oj.leetcode.com/problems/reverse-words-in-a-string/
Given an input string, reverse the string word by word.
For example,Given s = "
the sky is blue
",
return "
blue is sky the
"
public String reverseWords(String s)
这一题本身的做法是很简单的,就是想翻转整个字符串,然后再逐次翻转。可是如果仅仅是这样oj的通过率必然不会如此之低。这一题在oj里最大的问题在于空格。这一题oj故意在词间加入了很多空格,但实际上输出又要求我们删除空格,所以相对就麻烦一点。当然,麻烦的前提也就是你是否希望给一个类似inplace的解法。
事实上就是在普通reverseWords的前提下加入一点偏移量的计算就好。只是每一个单词如果存在着偏移量,那么必须原地翻转然后再根据位移量进行偏移。主要是避免对元数据进行覆盖。
给出代码如下:
public void partialReverse(int offset, int head, int tail, char[] arr){
int tmphead = head, tmptail = tail;
while(tmphead < tmptail){
char tmp = arr[tmphead];
arr[tmphead] = arr[tmptail];
arr[tmptail] = tmp;
tmphead++;
tmptail--;
}
if(head != offset){
while(head <= tail){
arr[offset] = arr[head];
head++;
offset++;
}
}
}
public String reverseWords(String s) {
s = s.trim();
char[] res_arr = s.toCharArray();
int tail = res_arr.length - 1, head = 0;
partialReverse(0, 0, tail, res_arr);
tail = 0;
head = 0;
int offset = 0;
while(true){
while(tail < s.length() && res_arr[tail] != ' '){
tail++;
}
tail--;
partialReverse(offset, head, tail, res_arr);
tail++;
offset += tail - head;
if(tail == s.length())
break;
res_arr[offset] = ' ';
offset++;
while(res_arr[tail] == ' ')
tail++;
head = tail;
}
return new String(res_arr, 0, offset);
}