近期面试有这样一个问题,给定一个字符串,将其倒序输出,这种问题乍一看很好处理,但是实际在写的时候不知道怎么写了,有思路,但是没写出来。记录一下。
字符串反转实现的方式有多种,本质思想是将两端的数据进行对调,这个需要关系到二分法。
计算字符串总长度对半从前往后或者从后往前进行字符串反转都可以。看很多源码里是从后往前处理。
还可以通过数据结构中的栈实现,因为栈是后进先出(Last In First Out,LIFO)的数据结构,对于字符串倒序输出,正好符合这个要求。
下面以 java 为例进行说明
public class StringReverse {
public static void reverse(String str) {
char[] array = str.toCharArray();
int length = array.length - 1;
// 取中间值
int half = array.length >> 1;
// way1(array, length, half);
// way2(array, length, half);
// array = way3(array, length);
// array = way4(array);
array = way5(array, length);
System.out.println(new String(array));
}
/**
* 两数交换
*
* @param array
* @param length
* @param half
*/
public static void way1(char[] array, int length, int half) {
for (int i = 0; i < half; i++) {
char t = array[length - i];
array[length - i] = array[i];
array[i] = t;
}
}
/**
* 异或方式交换
*
* @param array
* @param length
* @param half
*/
public static void way2(char[] array, int length, int half) {
for (int i = 0; i < half; i++) {
array[length - i] ^= array[i];
array[i] ^= array[length - i];
array[length - i] ^= array[i];
}
}
/**
* 数组倒序拼接
*
* @param array
* @param length
* @return
*/
public static char[] way3(char[] array, int length) {
StringBuffer temp = new StringBuffer();
for (int i = length; i >= 0; i--) {
temp.append(array[i]);
}
array = temp.toString().toCharArray();
return array;
}
/**
* 通过 StringBuffer 调用 AbstractStringBuilder 的 reverse() 实现倒序
*
* @param array
* @return
*/
public static char[] way4(char[] array) {
StringBuffer temp = new StringBuffer();
array = temp.append(array).reverse().toString().toCharArray();
return array;
}
/**
* 通过 String 的 charAt() 倒序拼接
*
* @param array
* @param length
* @return
*/
public static char[] way5(char[] array, int length) {
String s = new String(array);
StringBuffer temp = new StringBuffer();
for (int i = length; i >= 0; i--) {
temp.append(s.charAt(i));
}
array = temp.toString().toCharArray();
return array;
}
public static void main(String[] args) {
reverse("1234");
}
}
对于面试中遇到的问题,一般是考察算法类的,对应代码里的第一种和第二种,那种内部封装的一般情况下不会问这个。
java 语言的好处是很多地方给开发人员封装了,带来的坏处是不思考这些底层问题了,在遇到一些问题的时候棘手。