剑指offer中取双元素法寻找数组中的最小值和最大值中的bug

剑指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);
                      }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值