解决方案
本博文讨论的“数组反转”是直接修改原数组,而不是重新创建一个新数组进行反转。一般有两种算法,一种是计算出两者的索引值,据此进行交换,可以参考StringBuilder类中的reverse方法;一种是利用双指针,移动数组两端进行交换。
算法实现
第一种方法的实现代码如下所示:
public void reverse(int[] array){
int len;
if(array == null || (len = array.length) < 2){
return;
}
for(int n = len - 1, i = (n - 1) >>> 1; i >= 0; --i){
swap(array, i, n - i);
}
}
public void reverse(int[] array, int begin, int end){
checkBounds(array, begin, end);
for(int n = begin + end, i = n >>> 1; i >= 0; --i){
swap(array, i, n - i);
}
}
private void swap(int[] array, int i, int j){
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
private void checkBounds(int[] array, int begin, int end){
if(begin > end){
throw new IllegalArgumentException("begin = " begin + ", end = " + end);
}
if(begin < 0){
throw new IllegalArgumentException("begin = " + begin);
}
if(end >= array.length){
throw new IllegalArgumentException("end = " + end);
}
}
第一种方法的实现代码如下所示:
public void reverse(int[] array){
int len;
if(array == null || (len = array.length) < 2){
return;
}
for(int begin = 0, end = len - 1; begin < end; ){
swap(array, begin++, end--);
}
}
public void reverse(int[] array, int begin, int end){
checkBounds(array, begin, end);
while(begin < end){
swap(array, begin++, end--);
}
}