讓前端面試不再難(常見演算法)

我是一個前端發表於2019-01-25

昨天聊了一個演算法題,今天接著聊!多聊幾個。

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 今天分享就到這,明天繼續!

相關文章