如何验证一个数组真的被打乱了?
方法一:先列出该数组的全排列。将该数组打乱 100 万次,记录每次打乱后出现的结果频次(哈希)。如果是完全乱序的话,各个结果出现的频次应该是差不多大的。
方法二:取一个数组,里面只有一个元素是 1,其他元素值都为 0。将该数组打乱 100 万次,1 出现在每个位置上的次数应该是差不多大的。
//时间复杂度为o(n^2)
function randomSortArray(arr){
let backArr = []
while(arr.length){
let index = parseInt(Math.random() * arr.length)
backArr.push(arr[index])
arr.splice(index,1)
}
return backArr
}
//时间复杂度为o(n)
function randomSortArray2(arr){
for(let i = 0; i < arr.length; i++){
let index = parseInt(Math.random() * (arr.length - i));
[arr[index],arr[arr.length - 1 - i]] = [arr[arr.length - 1 - i],arr[index]]
}
return arr
}
arr.sort(() => Math.random() - 0.5)
数组去重
function arrayUnique(arr){
let res = []
for(let i = 0; i < arr.length; i++){
let item = arr[i]
(res.indexOf(item) === -1) && res.push(item)
}
return res
}
//hashmap
function arrayUnique2(arr){
let map = new Map()
for(let i = 0; i < arr.length; i++){
map.set(arr[i],(map.get(arr[i]) || 0) + 1)
}
console.log(map)
let res = []
for(let [k,v] of map){
res.push(k)
}
return res
}