让前端口试不再难(罕见算法)

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

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://segmentfault.com/a/1190000018023703
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞