代码:
//方法一:StringBuffer/StringBuilder
private String reverse1(String s) {
return new StringBuffer(s).reverse().toString();
}
//方法二:递归+字符串截取;不断的进行二分截取,递归返回;
/*
【时间复杂度:】渐渐跟下去就是n,n/2,n/4,…n/2^k,其中k就是循环的次数
由于你n/2^k取整后>=1
即令n/2^k=1
可得k=log2n,(是以2为底,n的对数)
所以时间复杂度可以表示O()=O(logn)
*/
private String reverse2(String s) {
int length = s.length();
if (length <= 1) {
return s;
} else {
String left = s.substring(0, length / 2);
String right = s.substring(length / 2);
return reverse2(right) + reverse2(left);
}
}
//方法三:字符串拼接
/*
【时间复杂度:】O()=O(n)
*/
private String reverse3(String s) {
int length = s.length();
//建议用StringBuilder
/*String reverse = "";
for (int i = 0; i < length; i++){
reverse = s.charAt(i) + reverse;
}
return reverse;*/
StringBuilder reverse = new StringBuilder();
for (int i = 0; i < length; i++) {
reverse.insert(0, s.charAt(i));
}
return reverse.toString();
}
//方法四:交换位置
private String reverse4(String s) {
char[] array = s.toCharArray();
for (int low = 0, high = array.length - 1; low < high; low++, high--) {
//交换位置
char temp = array[low];
array[low] = array[high];
array[high] = temp;
}
return String.valueOf(array);
}
//方法五:转换成字符数组再反转,和方法三字符串拼接是类似的
private String reverse5(String s) {
char[] chars = s.toCharArray();
char[] reverse = new char[chars.length];
for (int i = 0; i < chars.length; i++) {
reverse[i] = chars[chars.length - 1 - i];
}
return String.valueOf(reverse);
}
/**
* 反转字符串
*/
@Test
public void test5() {
System.out.println(reverse1("I love you"));
System.out.println(reverse2("the People's Republic of China"));
System.out.println(reverse3("ambulance"));
System.out.println(reverse4("five hundred miles"));
System.out.println(reverse4("That girl"));
}
实际应用要注意一些特殊情况比如入参为null或者空字符串,以及入参长度小于等于1 的情况等,保持代码的健壮性。