20140316 [LEET] Reverse Words in a String

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,所以直接被返回

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值