从今天开始,每周一道编程题,立贴为证!
今日编程题:
随机生成一个长度为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()];
}
以上就是我想到的三种方法,欢迎各位指点。。。