原题网址:https://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
".
Update (2015-02-12):
For C programmers: Try to solve it in-place in O(1) space.
Clarification:
- What constitutes a word?
A sequence of non-space characters constitutes a word. - Could the input string contain leading or trailing spaces?
Yes. However, your reversed string should not contain leading or trailing spaces. - How about multiple spaces between two words?
Reduce them to a single space in the reversed string.
方法:从右往左扫描。
public class Solution {
public String reverseWords(String s) {
if (null == s) return null;
StringBuilder sb = new StringBuilder();
int pos = s.length()-1;
for(int i=s.length()-1; i>=0; i--) {
if (s.charAt(i) == ' ') {
if (i < pos) {
if (sb.length() > 0) sb.append(" ");
sb.append(s.substring(i+1, pos+1));
}
pos = i-1;
}
}
if (0 <= pos) {
if (sb.length() > 0) sb.append(" ");
sb.append(s.substring(0, pos+1));
}
return sb.toString();
}
}
方法二:先全部左右反转,然后逐个单词再反转一次,注意好多坑。
public class Solution {
public String reverseWords(String s) {
char[] sa = s.toCharArray();
int size = 0;
for(int i=0; i<sa.length; i++) {
if (sa[i] != ' ' || (size>0 && sa[i] == ' ' && sa[size-1] != ' ')) sa[size++] = sa[i];
}
if (size > 0 && sa[size-1] == ' ') size --;
char[] ra = new char[size];
System.arraycopy(sa, 0, ra, 0, size);
for(int i=0, j=ra.length-1; i<j; i++, j--) {
char t = ra[i];
ra[i] = ra[j];
ra[j] = t;
}
int from = 0;
for(int i=0; i<=ra.length; i++) {
if (i==ra.length || ra[i] == ' ') {
for(int l=from, r=i-1; l<r; l++, r--) {
char t = ra[l];
ra[l] = ra[r];
ra[r] = t;
}
from = i+1;
}
}
return new String(ra);
}
}