关于瀑布流数组的一道面试题

今天看到一道题目,当时不会,听了讲解之后,觉得很有意思,先记录下来。

原题如下:

20 个随机数字,放到 3 个数组中 arr1, arr2,arr3 保证 3 个数组 的和相差最小;

先来解释一下这个题目:

    就是把20个随机数放在3个数组中,然后把每个数组中的值相加,最后再把每个数组中的和相减,得到差值是最小的。如果要想有这种效果,就得每个数组中的和都差距不大。

那么这要怎么做呢?

如果用过瀑布流的同学应该知道,传进来的图片大小是不一样的,所以每列的高度也不一样,不能让每列太长或者太短,所以,我们就看那列的高度最短,就把新的图片放在短的那一列上。

同样,这题原理和上面的瀑布流一样的,我们可以判断哪个数组里面的数值最小,然后把新的数值放在这个数组里面。

// 先得到20个随机数,放在arr数组
  var length = 20;
  var arr = [];
  for(var i = 0; i < length; i++){
    var index = Math.ceil(Math.random() * 20);
    arr.push(index)
  }
  
  // 创建3个数组,将arr数组中的3个数分别放在三个数组中
  var arr1 = [],
      arr2 = [],
      arr3 = [];
  arr1.push(arr[0]);
  arr2.push(arr[1]);
  arr3.push(arr[2]);

  // 在循环里把各个数组的和求出来,再比较,把新的值放在和小的数组内
  for(var i = 3; i < arr.length; i++){
    var arr1Size = add(arr1),
        arr2Size = add(arr2),
        arr3Size = add(arr3);
    arr1Size > arr2Size ? (arr2Size > arr3Size ? arr3.push(arr[i]) : arr2.push(arr[i])) : (arr1Size > arr3Size ? arr3.push(arr[i]) : arr1.push(arr[i]))
  }
  // 然后创建求和的方法
  function add(newArr){
    var size = 0;
    for(var i = 0; i < newArr.length; i++){
      size += newArr[i]
    }
    return size;
  }

  // 此时这个时候的3个数组的和的差值就是最小的了
  console.log(add(arr1));
  console.log(add(arr2));
  console.log(add(arr3));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值