关于一个数组的取出最大值和最小值的问题

代码如下

        var b = [99,1,2,4,3,5,8,6,7,9,0,34,56,78,98,45,23,45,23.45];
        function shuffle(arr){
            return arr.sort(function(){
                return Math.random() - 0.5;
            });
        }
        var a = shuffle(b);
        console.log(a);
        var max = a[0];
        var min = a[0];
        var maxindex = 0;
        var minindex = 0;
        for (var i = 0; i < a.length; i++) {
            if(max<a[i]){
                max = a[i];
                maxindex = i;
            }else if(min>a[i]){
                min = a[i]
                minindex = i;
            }
        }
        console.log(max==a[maxindex]);
        console.log(min==a[minindex]);

这段代码的判断感觉不是太正确,但是说不上来哪里出错了,结果是正确的,每次计算前都会打乱顺序
一般正常逻辑这样写代码:

        var b = [99,1,2,4,3,5,8,6,7,9,0,34,56,78,98,45,23,45,23.45];
        function shuffle(arr){
            return arr.sort(function(){
                return Math.random() - 0.5;
            });
        }
        var a = shuffle(b);
        console.log(a);
        var max = a[0];
        var min = a[0];
        var maxindex = 0;
        var minindex = 0;
        for (var i = 0; i < a.length; i++) {
            if(max<a[i]){
                max = a[i];
                maxindex = i;
            }
            if(min>a[i]){
                min = a[i]
                minindex = i;
            }
        }
        console.log(max==a[maxindex]);
        console.log(min==a[minindex]);
阅读 2.3k
3 个回答

区别分析:

// 代码一:这段代码不够优化
if (max < a[i]) {
  max = a[i];
  maxindex = i;
}
// 首先,max >= min(这是一定的)
// 所以当 max < a[i]时,
// 就会有min <= max < a[i] => min < a[i],
// 即是不可能 min > a[i]
// 所以 if (max < a[i])和if (min > a[i])不可能同时执行
// 所以这两个 if 可以合并到下面的 if(max < a[i]) else if(min > a[i])
if (min > a[i]) {
  min = a[i]
  minindex = i;
}


// 代码二:这段代码更好
if (max < a[i]) {
  max = a[i];
  maxindex = i;
} else if (min > a[i]) {
  min = a[i]
  minindex = i;
}

max 和 min 存在这三种方式有三种可能,

  1. 最大的,
  2. 最小的,
  3. 中间的,

如果max和min取到最小的,那么只会执行这一段

 if(max<a[i]){
   max = a[i];
   maxindex = i;
 }

如果max和min取到最大的,那么只会执行这一段

 if(min>a[i]){
     min = a[i]
     minindex = i;
 }

本质上和if...else if一样

如果取中间的,

第一次循环,max|min 不改变,

那么第二次循环,num 的可能值

  1. num>max|min
  2. num<max|min

num 不可能又大于还小于 max|min ,所以第二次循环之后,要么 max 改变,要么 min 改变,那么之后

  1. num>max
  2. max>num>min
  3. max>min>num

之后一个数如果比 max 大,就把赋值给 max,如果比 min 小,那么就赋值给 min,就有两种可能,所以用 if...if 和 if...else if... 是一样的。其它情况不执行

====

找最大值?最小值?

var b = [99,1,2,4,3,5,8,6,7,9,0,34,56,78,98,45,23,45,23.45];
Math.max.apply(null,b)
Math.min.apply(null,b)

因为max和min刚开始一样,所以没什么问题,如果初始值max=-999999,min=99999就有问题了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题