http://oj.leetcode.com/problems/reverse-words-in-a-string/
一道极简单的正则表达式问题。
public class LEET_Reverse_Words_in_a_String {
public static void main(String[] args) {
LEET_Reverse_Words_in_a_String m = new LEET_Reverse_Words_in_a_String();
System.out.println(m.reverseWords(""));
System.out.println(m.reverseWords(" "));
System.out.println(m.reverseWords(" "));
System.out.println(m.reverseWords("a"));
System.out.println(m.reverseWords(" a"));
System.out.println(m.reverseWords(" a"));
System.out.println(m.reverseWords("a "));
System.out.println(m.reverseWords("a "));
System.out.println(m.reverseWords(" a "));
System.out.println(m.reverseWords(" a "));
System.out.println(m.reverseWords(" a "));
System.out.println(m.reverseWords(" a "));
System.out.println(m.reverseWords(" aa b "));
System.out.println(m.reverseWords(" aa bbb cccc d "));
}
public String reverseWords(String s) {
String[] ss = s.split("\\s+");
if(ss.length == 0)
return "";
StringBuilder sb = new StringBuilder();
sb.append(ss[ss.length - 1]);
for (int i = ss.length - 2; i >= 0; --i) {
if(!ss[i].isEmpty()) {
sb.append(" ").append(ss[i]);
}
}
return sb.toString();
}
}
Spring的split() 函数支持依照正则表达式分割,所以直接用\\s+表示任意个连续的空格。
split()有个很搞笑的特点: 空字符串 “” split后是个长度为1的数组,其第一个元素值为空;而空格 " " 被split后是个长度为0的数组。我总是会忘记这个特例,只能依靠测试用例。
==================更新==========================
又想了一下,终于找到了 split() 的返回值的规律:
把split后的结果写成下述形式
[sector1] spliter [sector2] spliter [sector3] spliter ......... [sector n-1] spliter [sector n]
然后从sector n 开始倒过来走一遍,删除所有的空的sector,直到某个sector字符串长度大于0,或者全部删完。
剩余的sector组成数组返回。over
所以," ”.split("\\s") 形式为 [] \\s [] \\s [],按照上述规律,可知其返回长度为0的数组
" a ".split("\\s") 形式为 [] \\s [] \\s [a] \\s [] \\s [],其返回长度为3的数组
"".split("\\s") 根本不含spliter,所以直接被返回