题目链接:reverse-words-in-a-string
import java.util.Stack;
/**
*
* 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 ReverseWordsInAString {
//解法一
// 22 / 22 test cases passed.
// Status: Accepted
// Runtime: 410 ms
// Submitted: 0 minutes ago
//时间复杂度O(n) 空间复杂度O(n)
static String reverseWords(String s) {
String reverseString = "";
int i = 0;
while (i < s.length()) {
while (i < s.length() && s.charAt(i) == ' ') {
i++;
}
int begin = i;
while (i < s.length() && s.charAt(i) != ' ') {
i++;
}
if (begin != i && reverseString.length() != 0) {
reverseString = " " + reverseString;
}
reverseString = s.substring(begin, i) + reverseString;
}
return reverseString;
}
//解法二: 用StringBuilder快很多
// 22 / 22 test cases passed.
// Status: Accepted
// Runtime: 252 ms
// Submitted: 0 minutes ago
//时间复杂度O(n) 空间复杂度O(n)
static String reverseWords1(String s) {
StringBuilder sb = new StringBuilder();
Stack<String> stack = new Stack<String>();
int i = 0;
while (i < s.length()) {
while (i < s.length() && s.charAt(i) == ' ')
++i;
int begin = i;
while (i < s.length() && s.charAt(i) != ' ')
++i;
if (begin != i && stack.size() != 0)
stack.push(" ");
stack.add(s.substring(begin, i));
}
while (!stack.isEmpty())
sb.append(stack.pop());
return sb.toString();
}
public static void main(String[] args) {
System.out.println(reverseWords("the sky is blue"));
}
}