资讯专栏INFORMATION COLUMN

让前端面试不再难(常见算法)

nanchen2251 / 2408人阅读

摘要:昨天聊了一个算法题,今天接着聊多聊几个。如果是是数组那么递归执行,并把当前和已有传进去继续。如果不是直接到第二种,逻辑一样只不过遍历换成了,如果读的比较困难请移步了解第三种比较简单会默认过滤数组内部,算是一个奇淫技巧。

昨天聊了一个算法题,今天接着聊!多聊几个。

1、拍平数组(多维数组变成一维数组)

      let arr = [1,[2,3,[4],[5,6,[7]]],8]//[1,2,3,4,5,6,7,8]
      //这个有很多方法,我们一一说来
      //第一种遍历数组,遍历过程遇到数组递归。
       function flatten(arr, newArr) {
            //省去全局变量,还避开了函数嵌套闭包的形成。
            newArr = newArr || []
            for (let i = 0; i < arr.length; i++) {
                //如果是arr[i]是数组那么递归执行,并把当前arr[i]和已有newArr传进去继续push。
                //如果不是直接push到newArr
                typeof arr[i] === "object" ? flatten(arr[i], newArr) : newArr.push(arr[i])
            }
            return newArr
        }
        console.log(flatten(arr))
        //第二种,逻辑一样只不过遍历换成了reduce,如果读的比较困难请移步:https://segmentfault.com/a/1190000017510301 了解reduce
        function flatten1(arr) {
            return arr.reduce((newArr, item) => {
                return typeof item === "object" ? newArr.concat(flatten1(item, newArr)) : (newArr.push(item), newArr)
            }, [])
        }
        console.log(flatten1(arr))
        //第三种比较简单
        function flatten2(arr) {
            //join会默认过滤数组内部[],算是一个奇淫技巧。
            return arr.join(",").split(",")
        }
        console.log(flatten2(arr))
        //第三种稍有点问题,如果数组内是number类型会拍平后会变成字符串。

2、写一个方法判断字符串内()是否成对出现,是返回true不是返回false

        let str = "(()()())"
        let str1 = "(())()())"

        //1、先用栈的思路解决
        function isTure(str, result = []) {
            let arr = str.split("")
            for (let i = 0; i < arr.length; i++) {
                const item = arr[i];
                // 如果是左括号直接压栈
                if (item === "(") {
                    // 压栈
                    result.push(item);
                    // 如果是右括号且当前arr不为空弹出栈顶
                } else if (item === ")" && result.length != 0) {
                    // 弹出栈顶
                    result.pop()
                } else {
                    //如果是右括号且当前result为空,则直接判定为不合法
                    return false
                }
            }
            return result ? true : false
        }

        console.log(isTure(str)) //true
        console.log(isTure(str1)) //false

        2、用计数方式其实和栈原理类似
        function isTure1(str, count = 0) {
            let arr = str.split("")
            for (let i = 0; i < arr.length; i++) {
                const item = arr[i];
                if (item === "(") {
                    count++
                } else if (item === ")" && count != 0) {
                    count--
                } else {
                    return false
                }
            }
            return !count ? true : false
        }
        console.log(isTure1(str))//true
        console.log(isTure1(str1))//false

ok 今天分享就到这,明天继续!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/101426.html

相关文章

  • 前端面试不在常见算法一)

    摘要:今天开始,我从面试题切入开始做一些详解和记录,争取每个工作日一篇欢迎关注吐槽要求以对象的大小排序返回问题解析对象是无序的,我们需要转为有序数据结构,其实也就是转为数组然后后再去排序。 今天开始,我从面试题切入开始做一些详解和记录,争取每个工作日一篇!欢迎关注吐槽! const obj = { a: 1, b: 3, ...

    sunny5541 评论0 收藏0
  • 【进阶1-4期】JavaScript深入之带你走进内存机制

    摘要:引擎对堆内存中的对象进行分代管理新生代存活周期较短的对象,如临时变量字符串等。内存泄漏对于持续运行的服务进程,必须及时释放不再用到的内存。 (关注福利,关注本公众号回复[资料]领取优质前端视频,包括Vue、React、Node源码和实战、面试指导) 本周正式开始前端进阶的第一期,本周的主题是调用堆栈,今天是第4天。 本计划一共28期,每期重点攻克一个面试重难点,如果你还不了解本进阶计划...

    不知名网友 评论0 收藏0
  • 【进阶1-3期】JavaScript深入之内存空间详细图解

    摘要:进阶期理解中的执行上下文和执行栈进阶期深入之执行上下文栈和变量对象但是今天补充一个知识点某些情况下,调用堆栈中函数调用的数量超出了调用堆栈的实际大小,浏览器会抛出一个错误终止运行。 (关注福利,关注本公众号回复[资料]领取优质前端视频,包括Vue、React、Node源码和实战、面试指导) 本周正式开始前端进阶的第一期,本周的主题是调用堆栈,今天是第3天。 本计划一共28期,每期重点攻...

    coordinate35 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<