Java实现字符串反转的8种9种方法

标签: java 字符串 反转 | 发表时间:2015-04-24 14:20 | 作者:
出处:http://www.iteye.com

注:对于第7种使用异或的方式来实现字符串的反转,如果不太看得明白的,可以参照另一篇博客:

http://josh-persistence.iteye.com/blog/2205768

 

/**
 * 
 */
package com.wsheng.aggregator.algorithm.string;

import java.util.Stack;

/**
 * 8 种字符串反转的方法, 其实可以是9种方法,第9种是使用StringBuffer和StringBuilder中实现的方法
 * @author Josh Wang(Sheng)
 * 
 * @email  [email protected]
 * 
 */
public class StringReverse {

	/**
	 * 二分递归地将后面的字符和前面的字符连接起来。
	 * 
	 * @param s
	 * @return
	 */
	public static String reverse1(String s) {
		int length = s.length();
		if (length <= 1)
			return s;
		String left = s.substring(0, length / 2);
		String right = s.substring(length / 2, length);
		return reverse1(right) + reverse1(left);
	}
	
	/**
	 * 取得当前字符并和之前的字符append起来
	 * @param s
	 * @return
	 */
	public static String reverse2(String s) {
		int length = s.length();
		String reverse = "";
		for (int i=0; i<length; i++)
			reverse = s.charAt(i) + reverse;
		return reverse;
	}
	
	/**
	 * 将字符从后往前的append起来
	 * @param s
	 * @return
	 */
	public static String reverse3(String s) {
		char[] array = s.toCharArray();
		String reverse = "";
		for (int i = array.length - 1; i >= 0; i--) {
			reverse += array[i];
		}
		return reverse;
	}
	
	/**
	 * 和StringBuffer()一样,都用了Java自实现的方法,使用位移来实现
	 * @param s
	 * @return
	 */
	public static String reverse4(String s) {
		return new StringBuilder(s).reverse().toString();
	}
	
	/**
	 * 和StringBuilder()一样,都用了Java自实现的方法,使用位移来实现
	 * @param s
	 * @return
	 */
	public static String reverse5(String s) {
		return new StringBuffer(s).reverse().toString();
	}
	
	/**
	 * 二分交换,将后面的字符和前面对应的那个字符交换
	 * @param s
	 * @return
	 */
	public static String reverse6(String s) {
		char[] array = s.toCharArray();
		int end = s.length() - 1;
		int halfLength = end / 2;
		for (int i = 0; i <= halfLength; i++) {
			char temp = array[i];
			array[i] = array[end-i];
			array[end-i] = temp;
		}
		
		return new String(array);
	}
	
	/**
	 * 原理是使用异或交换字符串
	 * a=a^b; 
	 * b=b^a; 
         * a=b^a;
	 * 
	 * @param s
	 * @return
	 */
	public static String reverse7(String s) {
		char[] array = s.toCharArray();
		  
		  int begin = 0;
		  int end = s.length() - 1;
		  
		  while (begin < end) {
			   array[begin] = (char) (array[begin] ^ array[end]);
			   array[end] = (char) (array[end] ^ array[begin]);
			   array[begin] = (char) (array[end] ^ array[begin]);
			   begin++;
			   end--;
		  }
		  
		  return new String(array);
	}
	
	/**
	 * 基于栈先进后出的原理
	 * 
	 * @param s
	 * @return
	 */
	public static String reverse8(String s) {
		char[] array = s.toCharArray();
		Stack<Character> stack = new Stack<Character>();
		for (int i = 0; i < array.length; i++)
			stack.push(array[i]);

		String reverse = "";
		for (int i = 0; i < array.length; i++)
			reverse += stack.pop();
		  
		return reverse;
	}
	
	public static void main(String[] args) {
		System.out.println(reverse1("Wang Sheng"));
		System.out.println(reverse2("Wang Sheng"));
		System.out.println(reverse3("Wang Sheng"));
		System.out.println(reverse4("Wang Sheng"));
		System.out.println(reverse5("Wang Sheng"));
		System.out.println(reverse6("Wang Sheng"));
		System.out.println(reverse7("Wang Sheng"));
		System.out.println(reverse8("Wang Sheng"));
	}
}

 



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [java 字符串 反转] 推荐:

Java实现字符串反转的8种9种方法

- - ITeye博客
注:对于第7种使用异或的方式来实现字符串的反转,如果不太看得明白的,可以参照另一篇博客:. * 二分递归地将后面的字符和前面的字符连接起来. * 取得当前字符并和之前的字符append起来. * 将字符从后往前的append起来. * 和StringBuffer()一样,都用了Java自实现的方法,使用位移来实现.

判断字符串是否是有效json对象(java + gson )

- - 改善
已有 0 人发表留言,猛击->> 这里<<-参与讨论. —软件人才免语言低担保 赴美带薪读研.

(转)Java中字符串与内存泄漏的问题

- - jackyrong
对于这个写法,实际上对于oldStr是一个char[]数组[h,e,l,l,0,,,c,l,a,r,k],对于subString操作,newStr并不是自己copy oldStr的char[]数组hello自己去创建一个新的char[]数组,而是java在背后进行了String Reusing Optimization,它不会自己创建一个新的char数组,而是reuse原来的char数组.

字符串匹配 KMP 算法 Java实现

- - ITeye博客
字符串匹配过程中,如果使用蛮力算法,效率非常的差,在此介绍一种较为高效的匹配算法KMP算法. 其主要思想是从匹配的模版去分析,即去分析Pattern串的自身规律,进而去优化匹配的效率. 例如字符串“ababcb”,明显看出是ab出现一组重复,若出现如下匹配模式:. 此时发生错误,一般情况下会选择移动Pattern一个位置来继续,事实证明效果不佳.

Java字符串的10大热点问题盘点

- - 极客521 | 极客521
下面我为大家总结了10条Java开发者经常会提的关于Java字符串的问题,如果你也是Java初学者,仔细看看吧:. 1、如何比较字符串,应该用”==”还是equals(). 总的来说,”==”是用来比较字符串的引用地址,而equals()才是比较字符串的值. 两个值相同的字符串用”==”比较结果有可能是false,而用equals()则一定为true.

十个最常见的Java字符串问题 - liushaobo

- - 博客园_首页
翻译自: Top 10 questions of Java Strings. 用”==”还是用equals(). 简单地说,”==”测试两个字符串的引用是否相同,equals()测试两个字符串的值是否相同. 除非你希望检查两个字符串是否是同一个对象,否则最好用equals(). 2.为什么对于安全性敏感的信息char[]要优于String.

最佳字符串匹配算法(Damerau-Levenshtein距离算法)的Java实现

- - Java - 编程语言 - ITeye博客
原文: http://www.javacodegeeks.com/2013/11/java-implementation-of-optimal-string-alignment.html.  It implements a few well known tricks to use less memory by only hanging on to two arrays instead of allocating a huge n x m table for the memoisation table.

Java实现将字符串中的html代码过滤掉的方法

- - CSDN博客推荐文章
* 将带有html代码的字符串过滤掉其中的html代码. String htmlStr = inputString; //含html标签的字符串. String regEx_script = "<[\\s]*?script[^>]*?>[\\s\\S]*?<[\\s]*?\\/[\\s]*?script[\\s]*?>"; //定义script的正则表达式{或]*?>[\\s\\S]*?<\\/script> }.

java 两字符串相似度计算算法 (转)Levenshtein Distance编辑距离算法

- - 开源软件 - ITeye博客
Levenshtein distance最先是由俄国科学家Vladimir Levenshtein在1965年发明,用他的名字命名. 不会拼读,可以叫它edit distance(编辑距离). 原理很简单,就是返回将第一个字符串转换(删除、插入、替换)成第二个字符串的编辑次数. 次数越少,意味着字符串相似度越高 .

java常用流处理工具StreamTool 常见的InputStream流转字符串, 转字节数组等等

- - ITeye博客
原文: java常用流处理工具StreamTool 常见的InputStream流转字符串, 转字节数组等等. 源代码下载: http://www.zuidaima.com/share/1550463397366784.htm. ava 常用流处理工具 StreamTool ,常见的InputStream 流转字符串, 转字节数组等等.