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;
}

浙公网安备 33010602011771号