/**
*
*/
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

Java实现字符串反转的8种方法的更多相关文章

  1. Java将字符串反转的7种方法

    /方法1 递归方法 public static String reverse1(String s) { int length = s.length(); if(length <= 1){ ret ...

  2. 趣味算法:字符串反转的N种方法(转)

    老赵在反对北大青鸟的随笔中提到了数组反转.这的确是一道非常基础的算法题,然而也是一道很不平常的算法题(也许所有的算法深究下去都会很不平常).因为我写着写着,就写出来8种方法……现在我们以字符串的反转为 ...

  3. Python实现字符串反转的几种方法

    面试遇到的一个特无聊的问题--- 要求:在Python环境下用尽可能多的方法反转字符串,例如将s = "abcdef"反转成 "fedcba" 第一种:使用字符 ...

  4. [转]Python实现字符串反转的几种方法

    #第一种:使用字符串切片 result = s[::-1] #第二种:使用列表的reverse方法 l = list(s) l.reverse() result = "".join ...

  5. javascript 实现字符串反转的两种方法

    第一种方法:利用数组方法 //先split将字串变成单字数组,然后reverse()反转,然后将数组拼接回字串 var str = "abcdef"; str.split(&quo ...

  6. c++中字符串反转的3种方法

    第一种:使用algorithm中的reverse函数 #include <iostream> #include <string> #include <algorithm& ...

  7. C/C++字符串反转的N种方法

    0x00 自己写一个 // 第一种 std::string reverse(std::string str) { std::string res(""); for (int i = ...

  8. Java遍历字符串数组的几种方法

    1. for循环 for(int i = 0; i < fields[].length; i++){ } 2 for each循环 for(String x:fields){ } 3. JDK8 ...

  9. JAVA:字符串反转

    import java.util.ArrayList;import java.util.Arrays;import java.util.Collections;import java.util.Lis ...

随机推荐

  1. Map.Entry

    Map.Entry Map是java中的接口,Map.Entry是Map的一个内部接口. Map提供了一些常用方法,如keySet().entrySet()等方法,keySet()方法返回值是Map中 ...

  2. AS3语言注意事项汇总

    1. 在IE中,主DisplayObject加入stage后,可能其大小还是0,这时可以通过监听resize信息,在主DisplayObject获得正确的大小后,运行主要程序.需要注意的是在这个过程中 ...

  3. Uva 10917

    题目链接:http://vjudge.net/contest/143062#problem/A 题意:一个人要从点1去到点2,中间还有很多点和很多条边.问你如果他每次走的边(a,b)都满足:a点到目标 ...

  4. 【Python】我的Python学习笔记【2】【using Python 3】

    ... 1. 在语法上,返回一个tuple可以省略括号,而多个变量可以同时接收一个tuple,按位置赋给对应的值, 所以,Python的函数返回多值其实就是返回一个tuple,但写起来更方便. 2. ...

  5. javascript 字符转换为ascii码,ascii码转换为字符

    <script> str="A"; code = str.charCodeAt(); str2 = String.fromCharCode(code); str3 = ...

  6. php进制转换函数

    1 十进制(decimal system)转换函数 ① 十进制转二进制 string  decbin(int number). 参数为一个十进制整型数字,不是整型数字会自动转为整型数字,如'3'转为3 ...

  7. 图片溢出div问题的最终解决方案

    2016.11.20备注: 此问题通过css的max-width:100%;即可解决. 前两天编写了一个前端页面,在本机上显示一切正常.不过在不断的测试中,发现了一个严重的问题,如果图片过大,会撑破d ...

  8. Python学习笔记(2)

    变量 变量名就像我们现实社会的名字,把一个值赋值给一个名字时,它会存储在存储中,称之为变量(Variable),在大多数语言中,都把这种行为称为“给变量赋值”或“把值存储在变量中”. 而Python与 ...

  9. 《BI那点儿事》SQL Server 2008体系架构

    Microsoft SQL Server是一个提供了联机事务处理.数据仓库.电子商务应用的数据库和数据分析的平台.体系架构是描述系统组成要素和要素之间关系的方式.Microsoft SQL Serve ...

  10. [Prodinner项目]学习分享_第二部分_Entity到DB表的映射

    1.单纯映射 基本语法为 modelBuilder.Entity<InsType>().ToTable("TB_InsType"); 2.一对多映射(表关系) 实体类B ...