问题来源: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
".
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. - 我的实现代码:(开始看错了题目要求,以为就是一个字符串反转,直接用了new StringBuffer(s).reverse().toString(),后来发现不是一个简单的所有字符反转,而是单词顺序反转,但是单词还是那个单词!)
public class Solution {
public String reverseWords(String s) {
int length = s.length();
StringBuffer buff = new StringBuffer();
StringBuffer sb = new StringBuffer();
for (int i = length; i > 0; i--) {
if (s.charAt(i - 1) == ' ') {
buff.append(sb.reverse().toString());
sb = new StringBuffer();
buff.append(' ');
while (i-1 > 0) {
if (s.charAt(i - 2) == ' ') {
i--;
} else
break;
}
} else {
sb.append(s.charAt(i-1));
}
}
buff.append(sb.reverse().toString());
return buff.toString().trim();
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String s = scan.nextLine();
System.out.println(new Solution().reverseWords(s));
}
}
2016年7月12日 二刷此题,发现这么做效率太低,遂改用正则表达式来求。
public class ReverseWordsinaString {
// 用正则表达式做
public String reverseWords(String s) {
Pattern pattern = Pattern.compile("\\s+");
Matcher matcher = pattern.matcher(s);
String str = "";
int last = 0;
while (matcher.find()) {
// System.out.println(s.substring(0,matcher.start()));
str = s.substring(last, matcher.start()) + " " + str;
last = matcher.end();
}
str = s.substring(last) + " " + str;
return str.trim();
}
public static void main(String[] args) {
// TODO Auto-generated method stub
ReverseWordsinaString obj = new ReverseWordsinaString();
System.out.println(obj.reverseWords("Hello world you are smart"));
}
}