剑指offer编程题中,关于数组里面的“如何寻找数组中的最小值与最大值”中,文章中作者给出了五种方法,其中给出源代码的取双元素法,源代码如下:
public class TestMaxMin {
static int Max;
static int Min;
public static void GetMaxAndMin(int arr[]){
Max=arr[0];
Min=arr[0];
int len=arr.length;
for(int i=1;i<len-1;i=i+2){
if(i+1>len){
if(arr[i]>Max)
Max=arr[i];
if(arr[i]<Min)
Min=arr[i];
}
if(arr[i]>arr[i+1]){
if(arr[i]>Max)
Max=arr[i];
if(arr[i+1]<Min)
Min=arr[i+1];
}
if(arr[i]<arr[i+1]){
if(arr[i+1]>Max)
Max=arr[i+1];
if(arr[i]<Min)
Min=arr[i];
}
}
}
public static void main(String[] args){
int[] array={7,40,19,78};
GetMaxAndMin(array);
System.out.println("max="+Max);
System.out.println("min="+Min);
}
}
然后我进行了编译,结果如下:已经上传。
主函数中的数为7,40,19,78.这样做的目的是把数组中的最后一个数设置为最大数。程序执行的时候,先把第一个数7赋给min和max,然后取两个数(40和19),此时的最大数是40,最小数是7.此次循环结束。返回for循环,把i加2,i变成3,数组长度为4,for的判断条件,i<len-1,不满足,所以结束循环,所以这里的问题就是最后一个元素压根就没有参与比较,所以偶数个数组中,如果最大和最小值在末尾的话,得出的结果就是错误的。源代码对边界考虑不足。
所以要对代码进行修改,即针对源代码中的那种极端条件做一个判断,就是符合这种条件的时候,应该先比较,即if(i+1==len),满足这个条件就是到了最后一个元素,如然后在进行其他的比较(即没到边界条件),代码如下:
public class MaxMin {
static int Max;
static int Min;
public static void GetMaxAndMin(int arr[]){
Max=arr[0];
Min=arr[0];
int len=arr.length;
for(int i=1;i<len;i=i+2){
if(i+1==len){
if(arr[i]>Max)
Max=arr[i];
if(arr[i]<Min)
Min=arr[i];
}
else{
if(arr[i]>arr[i+1]){
if(arr[i]>Max)
Max=arr[i];
if(arr[i+1]<Min)
Min=arr[i+1];
}
if(arr[i]<arr[i+1]){
if(arr[i+1]>Max)
Max=arr[i+1];
if(arr[i]<Min)
Min=arr[i];
}
}
}
}
public static void main(String[] args){
int[] array={7,40,19,78};
GetMaxAndMin(array);
System.out.println("max="+Max);
System.out.println("min="+Min);
}
}