Java实现字符串反转的8种方法
2024-10-19 01:31:59
/**
*
*/
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
最新文章
- 【WPF】WPF中的List<;T>;和ObservableCollection<;T>;
- 一个面试题的解答-----从500(Id不连续)道试题库里随机抽取20道题!
- iOS 杂笔-23(区分各种空值)
- Yahoo! s4和Twitter storm的粗略比较
- Andriod项目开发实战(2)——JSON和XML的区别
- 微软ASP.NET MVC 学习地址
- 修改数据库中group_concat的返回结果的长度限制
- C# 之 读取Word时发生 “拒绝访问” 及 “消息筛选器显示应用程序正在使用中” 异常的处理
- HTML5 总结-Web存储-7
- JavaScript DOM省市自适配select菜单
- Sencha+cordova 构造 华丽手机程序,并讲讲,在商用项目中经常用到的cordova插件(一)
- 基础二 day4 日记
- asp.net+jQueryRotate开发幸运大转盘
- 吐槽:【计算机网络与通信】.张元.高清文字版.pdf
- Python 包管理(PYPA)
- 当TFS/VSTS遇上Power BI
- Linux(Ubuntu)使用日记(七)------终端控制器Terminator安装使用
- 洛谷T31039 九尾狐吃棉花糖
- JsonKey小写
- Thinkphp 关联模型
热门文章
- 上传预览图片自己做的.md
- 【Spring】利用Spring最简单地使用异步方法
- Android 获取全部应用
- JavaWeb学习总结_Servlet开发
- Android handler 详解(面试百分之100问到)
- [Selenium] 数字显示的月份转换为英文显示
- ubuntu 安装eclipse,adt,android sdk,离线
- ASP.Net Web.config 中引用外部config文件
- 经典SQL语句大全以及50个常用的sql语句
- Selenium for C#的入门Demo