基础算法题

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
    }
}

 

posted @ 2021-02-04 20:28  陈小作  阅读(113)  评论(0编辑  收藏  举报