“我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第1篇文章,点击查看活动详情”
今年大环境整体不好,降本提效成了今天互联网行业的代名词,大厂都在裁员,何况小厂呢,怎样从面试中脱颖而出成了大家需要思考的问题
最近面试有两点感触特别深刻:
- 广撒网,面试是哪家公司都不知道
- 不挑剔,即使不喜欢工作模式也勉强接受
深深的感受到了大家的无奈,建议大家2022轻易不要离职,努力提升自己的专业能力和编程思维
言归正传,正序数组乱序输出到底有啥用呢?我认为并没啥用,只是考察大家的js基础和思考能力
方法一:while循环
思路:
- 随机获取当前数组的下标
- 把原数组当前下标的值push到新数组
- 删除原数组当前下标的值
- 循环原数组的长度,直到长度为0结束循环
function disorder(arr) {
const newArr = []
while(arr.length > 0) {
const ind = Math.floor(Math.random() * arr.length)
newArr.push(arr[ind])
arr.splice(ind, 1)
}
return newArr
}
const arr = [1, 2, 3, 4, 5, 6, 7]
disorder(arr)
思考:
- 极端情况:每次随机数都是0,可能会原来顺序输出
- splice删除元素增加了时间复杂度
方法2:sort排序
思路:
- 通过sort方法进行排序
- 通过随机数与0.5的差值进行正序或者倒序排序
function disorder(arr) {
return arr.sort(() => Math.random() - 0.5)
}
const arr = [1, 2, 3, 4, 5, 6, 7]
disorder(arr)
思考:
- 极端情况:每次随机数都大于0.5,可能会原来顺序输出
- sort时间复杂度也比较高
方法3:洗牌算法
思路:
- 最后一项和前边随机下标位置互换
- 从后到前依次互换,直到第0项结束循环
function disorder(arr) {
let len = arr.length
while (len > 1){
let ind = Math.floor(Math.random() * len--);
[arr[len] , arr[ind]] = [arr[ind] , arr[len]]
}
return arr
}
const arr = [1, 2, 3, 4, 5, 6, 7]
disorder(arr)
思考:
- 时间复杂度较低