问题
随机生成一个长度为 10 的整数类型的数组,例如 [2, 10, 3, 4, 5, 11, 10, 11, 20],将其排列成一个新数组,要求新数组形式如下,例如 [[2, 3, 4, 5], [10, 11], [20]]。
分析题目
看到题目仔细思考下,前面的你会发现思考没有问题,生成一个长度为 10 的整数类型的数组,去掉重复元素,然后就是进行从小到大排序,到这里是没有什么争议的,但是你看到例子中这个最终的新数组就会发现这个题出的有歧义,why?
- 第一种
把现有数组按区间来分,以10位为单位区分,比如10以内的一组,10-20之间的一组,20-30之间的一组,以此类推; - 第二种
把现有数组如果是连续的放一组,不连续的单独放。
答案
- 先来看第一种理解方式
关键点是元素除以10的取整数作为新数组的下标
/*
* @Description:
* @Author: Jasper
* @Github: https://github.com/yuanxinfeng
* @Date: 2019-10-30 10:49:45
* @LastEditors: Jasper
* @LastEditTime: 2019-10-30 13:49:08
*/
//随机生成10位整型随机数组
const randomAry = (n = 10, range = { min: 1, max: 99 }) => {
let arr = Array.from({ length: n });
arr = arr.map(() => {
return Math.floor(Math.random() * (range.max - range.min + 1) + range.min);
});
console.log(`random - ${arr}`);
return arr;
};
let arr = randomAry();
function changeArr(arr) {
let resArr = [];
arr.forEach((n, i) => {
// 元素除以10的取整数作为新数组的下标
let key = parseInt(n / 10);
if (Array.isArray(resArr[key])) {
if (!resArr[key].includes(n)) {
resArr[key].push(n);
}
} else {
resArr[key] = [n];
}
});
// 这样导致 resArr有空集合 去空处理
return resArr.filter(Boolean);
}
let resArr = changeArr(arr);
console.log("result", resArr);
/*
random - 18,79,40,57,18,31,48,24,54,12
sort - 12,18,24,31,40,48,54,57,79
result - [ [ 12, 18 ], [ 24 ], [ 31 ], [ 40, 48 ], [ 54, 57 ], [ 79 ] ]
*/
- 第二种
随机生成10位整型随机数组
去重
排序
求连续结果
/*
* @Description:去重排序求连续
* @Author: Jasper
* @Github: https://github.com/yuanxinfeng
* @Date: 2019-10-30 10:49:45
* @LastEditors: Jasper
* @LastEditTime: 2019-10-30 11:12:24
*/
//随机生成10位整型随机数组
const randomAry = (n = 10, range = { min: 1, max: 99 }) => {
let arr = Array.from({ length: n });
arr = arr.map(() => {
return Math.floor(Math.random() * (range.max - range.min + 1) + range.min);
});
console.log(`random - ${arr}`);
return arr;
};
let arr = randomAry();
// 去重
arr = Array.from(new Set(arr));
// 排序
arr = arr.sort((x, y) => x - y);
console.log(`sort - ${arr}`);
// 求连续结果
let newAry = [];
for (let i = 0; i < arr.length; i++) {
let tmpAry = [arr[i]];
// index用于跳过已经处理过的数组元素
let index = arr.length;
for (let j = i + 1, count = 1; j < arr.length; j++, count++) {
// 判断是否是连续值
if (arr[i] + count === arr[j]) {
tmpAry.push(arr[j]);
} else {
index = j - 1;
break;
}
}
i = index;
newAry.push(tmpAry);
}
console.log("result", newAry);
/*
random - 58,87,32,48,16,5,2,4,83,99
sort - 2,4,5,16,32,48,58,83,87,99
result - [ [ 2 ], [ 4, 5 ], [ 16 ], [ 32 ], [ 48 ], [ 58 ], [ 83 ], [ 87 ], [ 99 ] ]
*/
网友评论