前端算法題收集

  1. 數(shù)組去重和排序的多種實現(xiàn)算法
let ary = [12,23,12,15,25,23,25,14,16];
// es6中的Set
let arr = [...new Set(ary)]
console.log(arr)
// es6中的Array.from
let arr = Array.from(new Set(ary))
console.log(arr)
// 循環(huán)的方式
let arr = []
for(let i = 0;i < ary.length;i++){
    let item = ary[i],
    args = ary.splice(i+1)
    if(args.indexOf(item) == -1){
        arr.push(item)
    }
}
// 相鄰項的處理方案
ary.sort((a,b)=>a-b)
ary = ary.join('@')+'@'
let reg = /(\d+@\1*)/g,
arr = []
ary.replace(reg,(val,group1 => {
    arr.push(Number(group1.slice(0,group1.length-1)))
    arr.push(parseFloat(group1))
}))
// 冒泡排序
function bubble(ary){
    let temp = null
    for(let i = 0;i<ary.length-1;i++){
        for(let j = 0;j<ary.length-1-i;j++){
            if(ary[j] > ary[j+1]){
                temp = ary[j]
                ary[j] = ary[j+1]
                ary[j+1] = temp
            }
        }
    }
    return ary
}
// 插入排序
function insert(ary){
    // 準(zhǔn)備一個新數(shù)組,用來存儲抓到手里的牌,開始先抓一張牌進(jìn)來
    let handle = []
    handle.push(ary[0])
    // 從第二項開始依次抓牌,一直到把臺面上的牌抓光
    for(let i = 1;i < ary.length;i++){
        // A是新抓的牌
        let A = ary[i]
        // 和手里的牌依次比較(從后向前比)
        for(let j = handle.length-1;j>=0;j--){
            // 每次要比較的手里的牌
            let B = handle[j]
            // 如果當(dāng)前新牌A比要比較的牌B大,把A放到B的后面
            if(A>B){
                handle.splice(j+1,0,A)
                break
            }
            // 已經(jīng)比到第一項,把新牌放到手中最前面
            if(j===0){
                handle.unshift(A)
            }
        }
    }
    return handle
}
// 快速排序
function quick(ary){
    // 結(jié)束遞歸(當(dāng)ary中小于等于一項,則不用處理)
    if(ary.length <= 1){
        return ary
    }
    // 找到數(shù)組的中間項,在原有的數(shù)組中把它移除
    let middleIndex = Math.floor(ary.length / 2)
    let middleValue = ary.splice(middleIndex,1)[0]
    // 準(zhǔn)備左右兩個數(shù)組,循環(huán)剩下數(shù)組中的每一項,比當(dāng)前項小的放到左邊數(shù)組中,反之放到右邊數(shù)組中
    let aryLefy = [],
    aryRight = []
    for(let i = 0;i<ary.length;i++){
        let item = ary[i]
        item < middleValue ? aryLeft.push(item) : aryRight.push(item)
    }
    // 遞歸方式讓左右兩邊的數(shù)組持續(xù)這樣處理,一直到左右兩邊都排好順序為止,最后左邊中間右邊拼接成最后結(jié)果
    return quick(aryLeft).concat(middleValue,quick(aryRight))
}
  1. 數(shù)組扁平化的N種實現(xiàn)方案
let arr = [
    [1,2,2],
    [3,4,5,5],
    [6,7,8,9,[11,12,[12,13,[14]]]],10
]
// es6 無線層級扁平化
arr = arr.flat(Infinity)
// toString再轉(zhuǎn)數(shù)組
arr = arr.toString().split(',').map(item=>paseFloat(item))
// 循環(huán)驗證是否為數(shù)組
while(arr.some(item => Array.isArray(item))){
  arr = [].concat(...arr)
}
  1. 阿里面試題之斐波那契數(shù)列
// 方式1
function fibonacci(n){
    if(n <= 1) return 1
    let arr = [1,1]
    // 即將要創(chuàng)建多少個
    let i = n + 1 - 2
    while(i > 0){
        let a = arr[arr.length - 2],
        b = arr[arr.length - 1]
        arr.push(a + b)
        i--
    }
    return arr[arr.length - 1]
}
// 方式2
function fibonacci(count){
    function fn(count,curr = 1, next = 1){
        if(count == 0){
            return curr
        }else{
            return fn(count - 1,next,curr + next)
        }
    }
    return fn(count)
}
  1. 字節(jié)跳動經(jīng)典算法題
/*
 * 輸入一個正數(shù)N,輸出所有和為N的連續(xù)正數(shù)序列
 * 例如: 輸入15
 * 結(jié)果: [[1,2,3,4,5],[4,5,6],[7,8]]
*/
function createArr(n,len){
    let arr = new Array(len).fill(null),
    temp=[]
    arr[0] = n
    arr = arr.map((item,index) => {
        if(item===null){
            item = temp[index - 1] + 1
        }
        temp.push(item)
        return item
    })
    return arr
}
function fn(count){
    let result = []
    // 求出中間值
    let middle = Math.ceil(count / 2)
    // 從1開始累加
    for(let i = 1;i <= middle;i++){
        // 控制累加多少次
        for(let j = 2;;j++){
            // 求出累加多次的和
            let total = (i + (i + j - 1)) * (j / 2)
            if(total > count){
                break
            }else if(total === count){
                result.push(createArr(i,j))
                break
            }
        }
    }
    return result
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Q1 判斷一個單詞是否是回文? 回文是指把相同的詞匯或句子,在下文中調(diào)換位置或顛倒過來,產(chǎn)生首尾回環(huán)的情趣,叫做回...
    Giann閱讀 896評論 0 0
  • 夜鶯2517閱讀 128,213評論 1 9
  • 版本:ios 1.2.1 亮點(diǎn): 1.app角標(biāo)可以實時更新天氣溫度或選擇空氣質(zhì)量,建議處女座就不要選了,不然老想...
    我就是沉沉閱讀 7,508評論 1 6
  • 我是一名過去式的高三狗,很可悲,在這三年里我沒有戀愛,看著同齡的小伙伴們一對兒一對兒的,我的心不好受。怎么說呢,高...
    小娘紙閱讀 3,882評論 4 7
  • 我是黑夜里大雨紛飛的人啊 1 “又到一年六月,有人笑有人哭,有人歡樂有人憂愁,有人驚喜有人失落,有的覺得收獲滿滿有...
    陌忘宇閱讀 8,887評論 28 54

友情鏈接更多精彩內(nèi)容