首先要先介绍一下如何将两个字母,不借助额外的空间做到交换。
如下所示,提供两种方式:
private static void swap1(char a,char b){
System.out.println("a is: "+a);
System.out.println("b is: "+b);
a=(char) (a+b);
b=(char) (a-b);
a=(char) (a-b);
System.out.println("a is: "+a);
System.out.println("b is: "+b);
}
private static void swap2(char a,char b){
System.out.println("a is: "+a);
System.out.println("b is: "+b);
a=(char) (a^b);
b=(char) (a^b);
a=(char) (a^b);
System.out.println("a is: "+a);
System.out.println("b is: "+b);
}
接下来看看其中反转字符串的方法:
//第一种巧妙地使用递归
private static String reverse1(String str){
int length=str.length();
if(length<=1) return str;
String left=str.substring(0, length/2);
String right=str.substring(length/2,length);
return reverse1(right)+reverse1(left);
}
// 第二种将字符向前插入
private static String reverse2(String str){
int length=str.length();
String reverse="";
for(int i=0;i<length;i++){
reverse=str.charAt(i)+reverse;
}
return reverse;
}
private static String reverse22(String str){
int length=str.length();
StringBuilder reverse=new StringBuilder();
for(int i=0;i<length;i++){
//每次在0位置插入,StringBuilder中的元素会自动后移??
reverse.insert(0, str.charAt(i));
}
return reverse.toString();
}
//第三种从后到前添加字符
private static String reverse3(String str){
int length=str.length();
String reverse="";
for(int i=length-1;i>=0;i--){
reverse=reverse+str.charAt(i);
}
return reverse;
}
private static String reverse33(String str){
int length=str.length();
StringBuilder reverse=new StringBuilder();
for(int i=length-1;i>=0;i--){
reverse.append( str.charAt(i));
}
return reverse.toString();
}
//毫无创意
private static String reverse4(String str){
StringBuilder stringBuilder=new StringBuilder(str);
return stringBuilder.reverse().toString();
}
//第五种:一分为二,左右互换
private static String reverse5(String str){
char temp;
int length=str.length();
char[] array=str.toCharArray();
for(int i=0;i<(length-1)/2;i++){
temp=array[i];
array[i]=array[length-1-i];
array[length-1-i]=temp;
}
return new String(array);
}
//第六种,使用util包中的Stack
private static String reverse6(String str){
char[] array=str.toCharArray();
Stack<Character> stack=new Stack<Character>();
for(int i=0;i<str.length();i++){
stack.push(array[i]);
}
String reverse="";
for(int i=0;i<str.length();i++){
reverse=reverse+stack.pop();
}
return reverse;
}
//第七种,从两头开始互换,向中间推进
public static String reverse7(String s) {
char[] str = s.toCharArray();
int begin = 0;
int end = s.length() - 1;
while (begin < end) {
str[begin] = (char) (str[begin] ^ str[end]);
str[end] = (char) (str[begin] ^ str[end]);
str[begin] = (char) (str[end] ^ str[begin]);
begin++;
end--;
}
return new String(str);
}