/**
*
*/
package com.wsheng.aggregator.algorithm.string; import java.util.Stack; /**
* 8 种字符串反转的方法, 其实可以是9种方法,第9种是使用StringBuffer和StringBuilder中实现的方法
* @author Josh Wang(Sheng)
*
* @email swang6@ebay.com
*
*/
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"));
}
}

第二种方法很有意思,不同顺序得出的结果不一样,值得仔细研究实现

方法七与交换a+b类似,很有新意

原文转自:http://josh-persistence.iteye.com/blog/2205772

最新文章

  1. 【WPF】WPF中的List&lt;T&gt;和ObservableCollection&lt;T&gt;
  2. 一个面试题的解答-----从500(Id不连续)道试题库里随机抽取20道题!
  3. iOS 杂笔-23(区分各种空值)
  4. Yahoo! s4和Twitter storm的粗略比较
  5. Andriod项目开发实战(2)——JSON和XML的区别
  6. 微软ASP.NET MVC 学习地址
  7. 修改数据库中group_concat的返回结果的长度限制
  8. C# 之 读取Word时发生 “拒绝访问” 及 “消息筛选器显示应用程序正在使用中” 异常的处理
  9. HTML5 总结-Web存储-7
  10. JavaScript DOM省市自适配select菜单
  11. Sencha+cordova 构造 华丽手机程序,并讲讲,在商用项目中经常用到的cordova插件(一)
  12. 基础二 day4 日记
  13. asp.net+jQueryRotate开发幸运大转盘
  14. 吐槽:【计算机网络与通信】.张元.高清文字版.pdf
  15. Python 包管理(PYPA)
  16. 当TFS/VSTS遇上Power BI
  17. Linux(Ubuntu)使用日记(七)------终端控制器Terminator安装使用
  18. 洛谷T31039 九尾狐吃棉花糖
  19. JsonKey小写
  20. Thinkphp 关联模型

热门文章

  1. 上传预览图片自己做的.md
  2. 【Spring】利用Spring最简单地使用异步方法
  3. Android 获取全部应用
  4. JavaWeb学习总结_Servlet开发
  5. Android handler 详解(面试百分之100问到)
  6. [Selenium] 数字显示的月份转换为英文显示
  7. ubuntu 安装eclipse,adt,android sdk,离线
  8. ASP.Net Web.config 中引用外部config文件
  9. 经典SQL语句大全以及50个常用的sql语句
  10. Selenium for C#的入门Demo