JS-每周3道面试题(第4周)

297 阅读1分钟

这周看一下算法题

1. 快排算法

思路:取数组的中间值,用splice方法从数组中剔除,创建两个数组对象,left和right,对处理的数组循环,值比中间数小的推入left数组,大的推入right数组,然后递归left和right

    var arr = [2,1,23,12,11,44,66]
    
    function quickSort (arr) {
        if (arr.length < 2) return arr
        var left = []
        var right = []
        var ponitIndex = Math.floor(arr.length/2)
        var point = arr[ponitIndex]
        arr.splice(ponitIndex, 1)
    
        for (var i=0; i<arr.length; i++) {
          if (arr[i] < point) {
            left.push(arr[i])
          } else {
            right.push(arr[i])
          }
        }
        return res = quickSort(left).concat(point, quickSort(right))
    }
    
    console.log(quickSort(arr))

结果:

结果

2. 给定一个数num,在一个数组中找到所有两个数之和等于num的数的下标

思路:先将数组去重排序,分别给数组两个指针指向头部最小的值和尾部最大值,将两值加起来和指定值做比较,大了就尾部向前进一位,小了头部向后进一位,相等返回坐标,然后头尾都向中间进一位继续查找,以此类推,找不到则返回-1

    let array = [1, 9, 2, 7, 10, 11, 5, 6, 4, 2, 4, 5]
    let sum = 10
    // 先去重
    let _arr = new Set(array)
    _arr = [..._arr]
    
    // 再排序
    _arr = _arr.sort((a, b) => {
        return a - b
    })
    
    function getSum (arr, sum) {
        if (arr == '' || arr.length == 0) return
        
        let left = 0
        let right = arr.length - 1
        
        while (left < right) {
            let _sum = arr[left] + arr[right]
            if (_sum > sum) {
                right--
            } else if (_sum < sum) {
                left++
            } else if (_sum == sum) {
                console.log(left, right)
                left++
                right--
            } else {
                return (-1, -1)
            }
        }
    }
    
    getSum(_arr, sum)

结果:

结果

3. 洗牌算法

思路:在循环中取随机数,利用const的不可变性,让当前的值与下标是随机数的值对换

    var arr = [1,2,3,4,5,6,7,8]
    
    function shuffle(arr) {
        let _arr = arr.concat()
        for (let i=_arr.length; i--; i>=0) {
            // 使用const 使之不可变
           const j = Math.floor(Math.random() * (i+1) )
           const temp = _arr[i]
           _arr[i] = _arr[j]
           _arr[j] = temp
        }
        return _arr
    }
    
    console.log(shuffle(arr))

结果:

洗牌