编程训练--每周一道编程题(一)

从今天开始,每周一道编程题,立贴为证!

今日编程题:

随机生成一个长度为10的整数类型的数组,例如[2,10,3,4,5,11,10,11,20,23],将其排列成一个新数组,要求新数组形式如下,例如[[2,3,4,5],[10,11],[20,23]]

其实,我感觉这道题有一点问题,因为没有限制数组内元素的范围,如果是1-100000就不太好分了,所以,我觉得应该限制为1-100;这样这个题就合理多了。

好了,话不多说,接下来是编码时间。(Talk is cheap,Show me the code!

首先我们来分析,首先第一步当然是申明一个数组,数组长度为10,数组内元素为1-100的随机整数,然后排序,去重(或者去重,排序)。下面的分组才是关键,我们发现一个分组内的元素除以10向下取整是一样的。既然发现规律了就好说了,首先先说我写出来的第一种方法:

function method1() {
        const getRandomNum = () => Math.floor(Math.random() * 100) + 1;//随机获取1-100的整数
        const arr = Array.from({ length: 10 }).map(getRandomNum);
        return [...new Set(arr)]
          .sort((a, b) => a - b)
          .reduce((acc, num, index, array) => {
            index == 0
              ? acc.push([num])
              : Math.floor(num / 10) == Math.floor(array[index - 1] / 10)
              ? acc[acc.length - 1].push(num)
              : acc.push([num]);
            return acc;
          }, []);
      }

这个分组的方法是用到了数组的reduce方法

接下来是第二个方法,这个方法是看到网上的一个网友改进而来

function method2() {
        const getRandomNum = () => Math.floor(Math.random() * 100) + 1;
        const arr = Array.from({ length: 10 }).map(getRandomNum);
        const newArr = [...new Set(arr)].sort((a, b) => a - b);
        const obj = {};
        newArr.forEach(item => {
          let key = Math.floor(item / 10);
          !obj[key] ? (obj[key] = [item]) : obj[key].push(item);
        });
        return [...Object.values(obj)];
      }

然后是第三个方法,用Object可以,那用Map也可以呀

function method3() {
        const getRandomNum = () => Math.floor(Math.random() * 100) + 1;
        const arr = Array.from({ length: 10 }).map(getRandomNum);
        const newArr = [...new Set(arr)].sort((a, b) => a - b);
        const arrayMap = new Map();
        newArr.forEach(item => {
          let key = Math.floor(item / 10);
          !arrayMap.has(key)
            ? arrayMap.set(key, [item])
            : arrayMap.get(key).push(item);
        });
        return [...arrayMap.values()];
      }

以上就是我想到的三种方法,欢迎各位指点。。。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值