zoukankan      html  css  js  c++  java
  • 基础算法题

    1、数组去重的方式

    // 数组去重实现得四种方式
    
    let arr = [1,3,1,5,6,8,1,2,3,6]
    // 1、利用set()
    arr =  [...new Set(arr)]
    arr = Array.from(new Set(arr))
    // 2、使用includes/indexOf (也可以自己和自己比较不定义新的数组,将重复的值设置为Null,到最后之后,通过filter将null过滤掉/ 将最后一个值和当前替换,长度减一,循环也减一也可以实现,并且数组之后得下标不会发生变化)
    let arr2 = []
    for(let i = 0; i < arr.length - 1; i++) {
        // if(arr2.indexOf(arr[i]) <= -1) {
        //     arr2.push(arr[i])
        // }
        let current = arr[i]
        let otherArr = arr.slice(i + 1)
        if(otherArr.indexOf(current) > -1) {
            arr[i] = arr[arr.length - 1]
            arr.length--
            i--
        }
    }
    
    // 3、利用对象的键名不重复
    // 3-1
    let obj = {}
    for(let i = 0; i < arr.length; i++) {
        obj[arr[i]] = arr[i]
    }
    
    // 3-2
    let obj = {}
    for(let i = 0; i < arr.length; i++) {
        if(obj[arr[i]] !== undefined) {
            arr[i] = arr[arr.length - 1]
            arr.length--
            i--
            continue
        }
        obj[arr[i]] = arr[i]
    }
    
    //4利用正则

    2、排序

    //基础排序算法 // 冒泡排序  快速排序  插入排序
    // 1、
    let sortArr = [3, 5, 6,1,4,2, 2,10,8]
    // 排序
    sortArr.sort((a, b) => a - b) // 可实现排序
    
    // 2、冒泡
    for(let i = 0; i < sortArr.length - 1; i++) {
        for(let j = 0; j < sortArr.length - i -1; j++) {
            if(sortArr[j] > sortArr[j + 1]) {
                [sortArr[j], sortArr[j + 1]] = [sortArr[j + 1], sortArr[j]]
            }
        }
    }
    
    // 3、插入排序
    let arr = [3, 1, 2, 123, 53, 123, 45, 49,66]
    let tempArr = [arr[0]]
    for(let i = 1; i < arr.length; i++) {
        for(let j = tempArr.length - 1; j >= 0; j-- ) {
            if(arr[i] < tempArr[j]) {
                if(j === 0) {
                    tempArr.splice(0,0, arr[i])
                    break
                } else {
                    continue
                }
            } else {
                tempArr.splice(j+1,0,arr[i])
                break
            }
        }
        console.log(tempArr)
    }
    // console.log(tempArr)
    
    // 快速排序
    
    function sortQuick(arr) {
        console.log(arr)
        if(arr.length <= 1) return arr
        let leftArr = []
        let rightArr = []
        let minIndex = Math.floor(arr.length / 2)
        let minValue = arr[minIndex]
        arr.splice(minIndex, 1)
        for (let i = 0; i < arr.length; i++) {
            if(arr[i] > minValue) {
                rightArr.push(arr[i])
            } else {
                leftArr.push(arr[i])
            }
        }
        // console.log(sortQuick(leftArr).concat(minValue, rightArr))
        return sortQuick(leftArr).concat(minValue,  sortQuick(rightArr))
    }

    3、数组扁平化

    // 数组扁平化
    let mutilArr = [
        [1],
        [2],
        [[3],[7], [[4, 5], 6]]
    ]
    // 1、 es6中提供得Array.prototype.flat处理
    mutilArr = mutilArr.flat(Infinity)
    
    // 2、通过toString
    mutilArr = mutilArr.toString().split(',').map((item) => {return parseFloat(item)})
    
    // 3、通过JSON.stringify再通过正则匹配replace替换掉[]符号
    console.log(mutilArr)
    
    // 4、通过some和扩展运算符
         while (mutilArr.some(item => Array.isArray(item))) {
            mutilArr = [].concat(...mutilArr) // 每执行一次扩展运算符则去一层
         }
    
    // 5递归
    function mutil(arr) {
        let result = []
        let fn = function (newArr) {
            for(let i = 0; i < newArr.length; i++) {
                if(Array.isArray(newArr[i])) {
                    fn(newArr[i])
                } else {
                    console.log(newArr[i])
                    result.push(newArr[i])
                }
            }
        }
        fn(arr)
        return result
    }

    4、斐波那契数列

    // 斐波那契数列
    //[1,1,2,3,5, 8]
    function fibonacci(n) {
        let arr = [1, 1]
        if(n <= 1) return 1
        for(let i = 2; i <= n; i++) {
            arr.push(arr[arr.length - 1] + arr[arr.length - 2])
        }
        return  arr[arr.length - 1]
    }
    
    // 使用递归实现
    function recFibonacci(n) {
        function fn(m, cur = 1, next = 1) {
           if(m === 0) {
               return cur
           } else {
              return fn(m-1,next, cur + next)
           }
    
        }
        return fn(n)
    }

    5、

    // 字节笔试题
    /*
    * 输入一个正数N,输出所有和为N的连续正数数列
    * 例如输入15
    * 结果:[[1,2,3,4,5], [4,5,6],[7, 8]]
    * */
    function contiguousArray(n) {
        let result = []
        let lastIndex = Math.ceil(n / 2) // 取中间数(向上)  当第1个数为中间数.后面不会有连续的数相加这个中间会等于n
        for(let i = 1; i < lastIndex; i++) {
            if(resultArr(i, n)) {
                result.push(resultArr(i, n))
            } else {
                continue
            }
        }
        return result
    }
    function resultArr(m, n) {
        let result = 0
        let arr = []
        for(let i = m;;i++) {
            arr.push(i)
            result += i
            if(result === n) return arr
            if(result > n) return false
        }
    }
  • 相关阅读:
    设计模式复习-简单工厂模式
    神经网络与机器学习 笔记—基本知识点(上)
    声明:songzijian这个域名已经被抢注。大家别上了。不是我了。
    《NO STRATEGY》《重塑战略》
    《THE LEAN STARTUP》 《精益创业》
    逆向与分析-WebBrowserPassView消息分析
    HTTP1.0,1.1,2.0,HTTPS
    Linux-鸟菜-7-Linux文件系统-EXT
    Linux-鸟菜-6-文件搜索
    反弹代理环境的搭建
  • 原文地址:https://www.cnblogs.com/cazj/p/14374819.html
Copyright © 2011-2022 走看看