前端算法题收集

  1. 数组去重和排序的多种实现算法
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)
// 循环的方式
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){
    // 准备一个新数组,用来存储抓到手里的牌,开始先抓一张牌进来
    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]
            // 如果当前新牌A比要比较的牌B大,把A放到B的后面
            if(A>B){
                handle.splice(j+1,0,A)
                break
            }
            // 已经比到第一项,把新牌放到手中最前面
            if(j===0){
                handle.unshift(A)
            }
        }
    }
    return handle
}
// 快速排序
function quick(ary){
    // 结束递归(当ary中小于等于一项,则不用处理)
    if(ary.length <= 1){
        return ary
    }
    // 找到数组的中间项,在原有的数组中把它移除
    let middleIndex = Math.floor(ary.length / 2)
    let middleValue = ary.splice(middleIndex,1)[0]
    // 准备左右两个数组,循环剩下数组中的每一项,比当前项小的放到左边数组中,反之放到右边数组中
    let aryLefy = [],
    aryRight = []
    for(let i = 0;i<ary.length;i++){
        let item = ary[i]
        item < middleValue ? aryLeft.push(item) : aryRight.push(item)
    }
    // 递归方式让左右两边的数组持续这样处理,一直到左右两边都排好顺序为止,最后左边中间右边拼接成最后结果
    return quick(aryLeft).concat(middleValue,quick(aryRight))
}
  1. 数组扁平化的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再转数组
arr = arr.toString().split(',').map(item=>paseFloat(item))
// 循环验证是否为数组
while(arr.some(item => Array.isArray(item))){
  arr = [].concat(...arr)
}
  1. 阿里面试题之斐波那契数列
// 方式1
function fibonacci(n){
    if(n <= 1) return 1
    let arr = [1,1]
    // 即将要创建多少个
    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. 字节跳动经典算法题
/*
 * 输入一个正数N,输出所有和为N的连续正数序列
 * 例如: 输入15
 * 结果: [[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
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,425评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,058评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,186评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,848评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,249评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,554评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,830评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,536评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,239评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,505评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,004评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,346评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,999评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,060评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,821评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,574评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,480评论 2 267

推荐阅读更多精彩内容

  • Q1 判断一个单词是否是回文? 回文是指把相同的词汇或句子,在下文中调换位置或颠倒过来,产生首尾回环的情趣,叫做回...
    Giann阅读 707评论 0 0
  • 夜莺2517阅读 127,664评论 1 9
  • 版本:ios 1.2.1 亮点: 1.app角标可以实时更新天气温度或选择空气质量,建议处女座就不要选了,不然老想...
    我就是沉沉阅读 6,802评论 1 6
  • 我是一名过去式的高三狗,很可悲,在这三年里我没有恋爱,看着同龄的小伙伴们一对儿一对儿的,我的心不好受。怎么说呢,高...
    小娘纸阅读 3,345评论 4 7
  • 我是黑夜里大雨纷飞的人啊 1 “又到一年六月,有人笑有人哭,有人欢乐有人忧愁,有人惊喜有人失落,有的觉得收获满满有...
    陌忘宇阅读 8,471评论 28 53