JS实现数组的随机 以及数组扁平化

记录一下今天面试的算法题 一个是实现数组的打乱输出,要求做到概率相同,还有一个是数组的扁平化,自己只想到了Array.flat 还有Array.isArray 其实还有别的方法 这里做一下总结

数组的随机打乱

1、'伪'打乱

function random(a, b) {

return Math.random()>.5 ? -1 : 1; //用Math.random()函数生成0~1之间的随机数与0.5比较,返回-1或1

}

[...arr].sort(random)

实际上这种方法并不能真正的随机打乱数组,每个元素有很大几率还在它原来的位置附近出现。

2.Fisher-Yates算法

// 1. 初始化原始数组和新数组,原始数组长度为n(已知);
// 2. 从还没处理的数组(假如还剩k个)中,随机产生一个[0, k)之间的数字p(假设数组从0开始);
// 3. 从剩下的k个数中把第p个数取出;
// 4. 重复步骤2和3直到数字全部取完;
// 5. 从步骤3取出的数字序列便是一个打乱了的数列。
function Shuffle1(arr){
    let res= []
    while(arr.length){
        let count = arr.splice(Math.floor(Math.random()*(arr.length)),1)[0]
        res.push(count)
    }
    return res
}
console.log(Shuffle1([1,2,3,4,5]));

3.Knuth-Durstenfeld算法

// 1. 建立一个数组大小为 n 的数组 arr,分别存放 1 到 n 的数值;
// 2. 生成一个从 0 到 n - 1 的随机数 x;
// 3. 输出 arr 下标为 x 的数值,即为第一个随机数;
// 4. 将 arr 的尾元素和下标为 x 的元素互换;
// 5. 同2,生成一个从 0 到 n - 2 的随机数 x;
// 6. 输出 arr 下标为 x 的数值,为第二个随机数;
// 7. 将 arr 的倒数第二个元素和下标为 x 的元素互换;
//    ……
// 如上,直到输出 m 个数为止
function Shuffle2(arr){
    let res = []
    // let res = new Array(arr.length)
    arr.forEach(item => res.push(item))
    for(let i = arr.length-1 ; i>=0 ;i--){
        let random = Math.floor(Math.random()*i)
        let temp = res[random]
        res[random] = res[i]
        res[i] = temp
    }
    return res
}

数组扁平化

1.利用Array.prototype.some()解决

some() 方法用于检测数组中的元素是否满足指定条件(函数提供)。
some() 方法会依次执行数组的每个元素: 如果有一个元素满足条件,则表达式返回true , 剩余的元素不会再执行检测。
如果没有满足条件的元素,则返回false。
注意: some() 不会对空数组进行检测。
注意: some() 不会改变原始数组。

 function fn(arr) {
       while (arr.some((item)=>Array.isArray(item))) {
           arr = [].concat(...arr)
       }
       return arr
   }

2.自己想得isArray递归

function myflat() {
    var aarr = [];
    var fn = (arr)=>{
        for (let i = 0; i <arr.length ; i++) {
            if (Array.isArray(arr[i])){
                fn(arr[i]);
             
            }else{
            aarr.push(arr[i])
            }
        }
    }
    fn(this);
    return aarr;
}
posted @ 2021-11-15 17:40  Frose  阅读(276)  评论(0)    收藏  举报