原地反转字符串中的单词

/**
 * 将字符串中的单词反转。如i am Chinese=》Chinese am i
 * 
 * @author crystal555 
 */
public class WordReverse {
	public static void main(String[] args) {
		String s = "i am Chinese man";
		String ss = method1(s);
		System.out.println(ss);
		ss = method2(s);
		System.out.println(ss);
	}

	/**
	 * 最简单的方法,直接split,然后交换
	 * 
	 * @param i
	 */
	private static String method1(String s) {
		// TODO Auto-generated method stub
		String[] a = s.split(" ");
		for (int i = 0; i < a.length / 2; i++) {
			String temp = a[i];
			a[i] = a[a.length - 1 - i];
			a[a.length - 1 - i] = temp;
		}
		String result = "";
		for (String ss : a) {
			result += ss + " ";
		}
		return result;
	}

	/**
	 * 考虑空间,先将整个句子反转,然后把单词部分反转,反转的时候不实用中间变量,直接用异或或者加减交换
	 * 
	 * @param s
	 * @return
	 */
	private static String method2(String s) {
		char[] a = s.toCharArray();
		// 先反转整个句子
		for (int i = 0; i < a.length / 2; i++) {
			// 最原始方法,但是需要空间
			// char tmp = a[i];
			// a[i] = a[a.length-1-i];
			// a[a.length-1-i] = tmp;
			// 不用空间,用加减方法交换
			// a[a.length-1-i] += a[i];
			// a[i] = (char)(a[a.length-1-i] - a[i]);
			// a[a.length-1-i] -= a[i];
			// 不用空间,用异或方法交换
			a[i] ^= a[a.length - 1 - i];
			a[a.length - 1 - i] ^= a[i];
			a[i] ^= a[a.length - 1 - i];
		}
		// 再反转所有单词
		for (int j = 0; j<a.length; j++) {
			int start = j;
			int end=j;
			for(end=j;end<a.length&&a[end]!=' ';end++);
//			System.out.println(start+" "+end);
			
			for(int k=start;k<(end+start)/2;k++){
				a[k] ^= a[end+start - 1 - k];
				a[end+start - 1 - k] ^= a[k];
				a[k] ^= a[end+start - 1 - k];
			}
			j = end;
		}
		return new String(a);
	}
}















  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值