【面试杂谈】正序数组乱序输出到底有啥用

329 阅读2分钟

“我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第1篇文章,点击查看活动详情

今年大环境整体不好,降本提效成了今天互联网行业的代名词,大厂都在裁员,何况小厂呢,怎样从面试中脱颖而出成了大家需要思考的问题

最近面试有两点感触特别深刻:

  1. 广撒网,面试是哪家公司都不知道
  2. 不挑剔,即使不喜欢工作模式也勉强接受

深深的感受到了大家的无奈,建议大家2022轻易不要离职,努力提升自己的专业能力和编程思维

言归正传,正序数组乱序输出到底有啥用呢?我认为并没啥用,只是考察大家的js基础和思考能力

方法一:while循环

思路:

  1. 随机获取当前数组的下标
  2. 把原数组当前下标的值push到新数组
  3. 删除原数组当前下标的值
  4. 循环原数组的长度,直到长度为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)

思考:

  1. 极端情况:每次随机数都是0,可能会原来顺序输出
  2. splice删除元素增加了时间复杂度

方法2:sort排序

思路:

  1. 通过sort方法进行排序
  2. 通过随机数与0.5的差值进行正序或者倒序排序
function disorder(arr) {
    return arr.sort(() => Math.random() - 0.5)
}
const arr = [1, 2, 3, 4, 5, 6, 7]
disorder(arr)

思考:

  1. 极端情况:每次随机数都大于0.5,可能会原来顺序输出
  2. sort时间复杂度也比较高

方法3:洗牌算法

思路:

  1. 最后一项和前边随机下标位置互换
  2. 从后到前依次互换,直到第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)

思考:

  1. 时间复杂度较低