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

问题

随机生成一个长度为 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 ] ]
*/

本文章由javascript技术分享原创和收集

发表评论 (审核通过后显示评论):