第 67 题:随机生成一个长度为 10 的整数类型的数组
随机生成一个长度为 10 的整数类型的数组,例如 [2, 10, 3, 4, 5, 11, 10, 11, 20],将其排列成一个新数组,要求新数组形式如下 [[2, 3, 4, 5], [10, 11], [20]]。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(58)
代码测试地址
菜鸟见解,轻喷
const randomArr = [];
while (randomArr.length<10) {
let num = parseInt(Math.random()*100);
if(randomArr.indexOf(num)==-1){
randomArr.push(num)
}
}
const sortArr = randomArr.sort((a,b)=>a-b);
//生成数组
console.log(sortArr)
const obj = {};
sortArr.forEach(el=>{
let cur = el+'';
if(cur.length==1){
if(!obj[0]){
obj[0] = [];
}
obj[0].push(el)
}else{
if(!obj[cur[0]]){
obj[cur[0]] = []
}
obj[cur[0]].push(el)
}
})
console.log(obj)
const arr = [];
for (const k in obj) {
arr.push(obj[k])
};
//输出结果
console.log(arr)
// 生成随机数组
function createNum() {
var arr = []
for(var i =0; i<10; i++) {
var num = Math.floor(Math.random()*100)
arr .indexOf(num)!=-1?i--:arr .push(num)
}
arr.sort((a,b) => { return a-b } )
return arr
}
// 生成map
function createMap () {
var map = {}
createNum().forEach(item => {
if(map[Math.floor(item/10)]) {
map[Math.floor(item/10)].push(item)
} else {
map[Math.floor(item/10)] = [item]
}
})
return map
}
// 结果
var numMap = createMap()
var newArr = []
for(var o in numMap ) {
newArr.push(numMap [o])
}
比较通俗的解法~
以为求连续 + 1
arr没有去重
你这个数组最后一个值是没有放到结果数组里面去的?
既然用到了sort就不用set去重了,双reduce搞定
// 生成10个随机整数数组
function gen(length) {
return new Array(length || 10).fill(0).map(() => Math.round(Math.random() * 100));
}
// 处理
function resolve(nums) {
let ans = [];
// 排序
nums.sort((a, b) => a - b);
// 遍历
let index = 0;
for (let i = 0; i < nums.length; i++) {
if (!ans[index]) {
ans[index] = [nums[i]];
} else {
// 填充
if (nums[i] < 10) {
ans[index].push(nums[i]);
} else if (nums[i].toString()[0] === nums[i - 1].toString()[0]) {
ans[index].push(nums[i]);
} else {
i--;
index++;
}
}
}
return ans;
}
console.info('处理结果:', resolve(gen(50)));
用�hash来存区间
学到了 Array.from 竟然还有第二个参数
随机函数借鉴了楼上前辈的(Array.from 第二个参数学到了!)
不知道我这样写行不行,望前辈们指点
遍历的次数有点多
// 随机数字数组
let randomArr = [2, 10, 3, 4, 5, 11, 10, 11, 20];
// 去重 排序
let arr = Array.from(new Set(randomArr)).sort((n1, n2) => {
return +n1 < +n2 ? -1 : 1;
});
let arr1 = [];
// 标记 不连续处标记‘XX’ 结果存放在arr1
for (let index = 1; index < arr.length; index++) {
let prev = arr[index - 1];
let current = arr[index];
arr1.push(prev)
if (current !== prev + 1) {
arr1.push('XX')
}
}
arr1.push(arr[arr.length - 1])
// 转为字符串处理
let result = arr1.join(',').split('XX').map(item =>
{
// 去掉多余的',',转为整数数组
return item.replace(/^,|,$/g, '').split(',').map(i => +i)
})
console.info(result)
const arr = [2, 10, 3, 4, 5, 11, 10, 11, 20, 55];
let res = [];
arr.sort((a, b) => a - b);
arr.forEach((n) => {
const index = (n / 10) | 0;
(res[index] || (res[index] = [])).push(n);
});
res = res.filter(Boolean);
console.log('res', res)
// 获取随机数
const randomArr = [...new Array(10)].map(item => +(Math.random() * 20).toFixed())
// 连续值(区间那个就不写了,区间的难度应该小点?)
let setArr = [...new Set(randomArr)].sort((a, b) => a - b)
let result = []
do {
let first = setArr[0]
const brother = setArr.filter(f => ((first + 1) == f) && (++first))
result.push(setArr.splice(0, brother.length + 1))
} while (setArr.length);
console.log(result); // 得到结果
比较简洁的写法,双指针。
还有第三个参数,哈哈哈哈哈
你这操作有点6
一般通过 还能优化
let nums = [2, 10, 3, 4, 5, 11, 10, 11, 20];
let res = []
nums.forEach(i => {
let posi = Math.floor(i / 10);
})
console.log('res===',res);
function fn(arr) {
arr = [...new Set(arr)].sort((a, b) => a - b)
let result = []
let offset = arr[0]
let temp = []
for (let i = 0; i < arr.length; i++) {
if (arr[i] !== i + offset) {
result.push(temp)
temp = [arr[i]]
offset = arr[i] - i
} else {
temp.push(arr[i])
}
}
return result
}
看了前几个写的,随机生成的数组都是有重复值的,去重会减少数组长度不可取
const radomList = []
// 生成随机数组
for(let i = 0;i<10;i++){
radomList.push(Math.floor(Math.radomi10))
}
// 去重+排序
const unique = Array.from(new Set(...radomList)).sort((a, b) => {return a-b})
// 归类
const obj = {}
unique.forEach((item, index) => {
const t = Math.floor(item/10)
if(!obj[t]){
obj[t] = []
}
obj[t].push(item)
})
//对象转数组
const finallList = []
for(const key in obj){
finallList.push(obj[key])
}
连续元素分类
function Test(){
let a = Array.from(new Set(new Array(10).fill(1).map(_ => Math.ceil(Math.random() * 10)))).sort((a, b) => a - b);
let result = [[a[0]]];
if(a.length === 1){
return result;
}
a.reduce((prev, next) => {
if(next - prev === 1){
result[result.length - 1].push(next);
}else{
result.push([next]);
}
return next;
})
return result;
}
[...new Set([...Array(10)].map(x = >parseInt(Math.random() * 10)))].sort((x, y) = >x - y).reduce(function(acc, cur, index, source) {
if (cur - acc[acc.length - 1] !== 1 && acc.length > 0) {
acc.push('-')
}
acc.push(cur) return acc
},
[]).toString().replace(/,/g, '').split('-').map((x) = >[x.split('')])
去重后还要保证数组的长度是不是10...
是的就是这个操作
我发现楼上的朋友们和我想的不太一样啊,我理解的题目意思是把连续的元素组成一个数组,比如
1,2,3,4
组成一个数组,7,8,9,10
组成一个数组,楼上的做法基本是把0-9,10-19这样的区间组成一个数组。姑且也贴一个我的理解的解法。区间分类
我起的早, 我先来吧
受思维惯性, 以为是求连续, 好吧, 修改了一波
我眉头一皱,又不会…………