专业编程教程与实战项目分享平台

网站首页 > 技术文章 正文

前端算法面试题 前端面试题csdn

ins518 2024-09-29 18:31:22 技术文章 89 ℃ 0 评论

时间太短;当时有点懵;后来想了一下做个记录;

题目:

Bash
//求合法括号的字符串个数
// 审题:
//2.合法的类型枚举:
//          嵌套行(())( (   4
//          父子行 ))(()())((  6 
//3.不考虑正则等方式;只能用js

就一两分钟答题时间:

刚开始的思路

Bash
 // 审题:
    //2.合法的类型枚举:
    //          嵌套行(())
    //          父子行 (()())
    // ((())(
    //3.不考虑正则等方式;只能用js
    //4. 他们的共同点 
    //      且左括号个数=== 右括号个数
    //      左边的第一个是( 右边的最后一个是)
    //      中间的部分同样全部吻合上述3个条件   
    //5.从第一个(开始找满足上面的第4条;从左至右;找到满足的就;后一位继续找;如果一直找不到;你开始从第二(开始找;知道最后
    function doneStr(str){
        let arr = Array.isArray(str)?str:str.split('')
        /**
         * 找到第一个(
        */
        let num = 0
        let findFirst = (arr)=>{
            let firstIndex =  null
            for(let i = 0; i<arr.length;i++){
                if(arr[i] === '('){
                    firstIndex = i
                    break;
                }
            }
            return firstIndex
        }
        let startIndex = findFirst(arr)
        if(startIndex === null){
            console.log('没有满足合法的字符串')
            return num
        }
        /**
         * 且左括号个数=== 右括号个数
         * 左边的第一个是( 右边的最后一个是)
         */
        let secondCheck = (arr,index)=>{
            let left = 0;
            let right = 0;
            let demo = [];
            let okDemo = []
            for(let i = index;i<arr.length;i++){
                demo.push(arr[i])
                if(arr[i]==='(') left++;
                if(arr[i]===')') right++;
                if(left === right && demo[0] ==='(' && demo[demo.length-1]===')'){
                    //可能满足的str
                    okDemo.push(demo)
                    //重新清空条件
                    left = 0;
                    right = 0;
                    demo = []
                }
            }
            return okDemo

        }

        let secondArr = secondCheck(arr,startIndex)
        /**
         * 递归处理这些可能的部分
         * 
         */
        let thirdCheck = (arr)=>{
            
            if(arr.length<=0) return num
            /**
             *一直做到这里 我都混乱 ;;
             * 反向我刚开始定的审题根本不对
             * 方向错了; 
             * 不能用正向思维
             * 反向思维走起来 
             */
            for(let i = 0; i <arr.length;i++){
                let newArr = arr[i].slice(1,-1)
                if(newArr.length === 2 && arr[0] ==='(' && arr[1]=== ')'){
                    num = num + 2
                }else{
                    num = num + doneStr(arr[i])
                }
            }
        }
        thirdCheck(secondArr)
        return num
    }

后来才知道我真的想复杂了

   /**
     *找()
     *找一个 删一个 ; 知道最后再也找不到
     * 
    */
    function test2(str){
        let num = 0
        let index = str.indexOf('()')
        if(index > -1){
            let newStr = str.substring(0,index) + str.substring(index+2)
            num= num + 2 + test2(newStr)
        }
        return num
    }
    // test2(str)

    console.log(test2(str))

到最后也不知道:所有的假设都符合上面的逻辑;有没有少

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表