亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

leetcode 一些算法題目記錄

mayaohua / 3537人閱讀

摘要:題目全部用做的,基本上每天一題的節(jié)奏。題目這里記錄自己對一些題目的思路和想法數(shù)字回文,說不能用額外的空間一下子懵逼了,第一概念就是換成字符串比較,但是感覺這樣子做就沒有意義了。找出任意兩條線段與軸組成的木桶,可以盛水最大的值。

前言

原文地址

無意間發(fā)現(xiàn) LeetCode 這個網(wǎng)站,一下子就陷進去了,大學(xué)時候看舍友參加 acm 一天到晚刷題,對算法總有點特殊的情懷。本以為我永遠是接觸不到這個了,沒想到 leetcode 卻讓我感覺到 Accepted 這個單詞的特殊魅力。

個人

首先自己并不是為了找工作去刷題的,純粹享受做題的過程和ac的快感。題目全部用 JavaScript 做的,基本上每天一題的節(jié)奏。開始總是想著怎么把答案解出來就好,經(jīng)常 TLE ,感覺一路做下來自己慢慢會考慮復(fù)雜度,邏輯嚴(yán)謹(jǐn)性也在逐步加強,對特殊值的考慮越來越多,相比于算法能力的提升我更欣喜看到自己邏輯嚴(yán)謹(jǐn)性加強,感覺這對自己后面的道路幫助會很大。

題目

這里記錄自己對一些題目的思路和想法

Palindrome Number

`

1         =>   true;
21         =>   false;
303        =>   true;

`

數(shù)字回文,說不能用額外的空間一下子懵逼了,第一概念就是換成字符串比較,但是感覺這樣子做就沒有意義了。看了別人思路發(fā)現(xiàn)給的數(shù)字每次取 10 的余數(shù)拼起來正好是數(shù)字倒過來寫。如果只取出一半,原數(shù)字也舍棄一半 正好就是回文的兩個內(nèi)容。有了思路就好做了判斷下特殊條件,比較最后兩個數(shù)字就可以了,如果是奇數(shù)位數(shù)字就減掉中間一位再比較。

    var max = Math.pow(2,31) - 1
    var isPalindrome = function(x) {
        if (x < 0 || x > max || (x != 0 && x % 10 == 0)) return false
        if (x < 10) return true
        var num = 0
        while(x > num) {
            num = num * 10 + x % 10
            x = Math.floor(x / 10)
        }
        return num == x || (x != 0 && Math.floor(num / 10) == x)
    };
    
Container With Most Water

`

給定一個數(shù)組,想象成一個二位坐標(biāo)系,數(shù)組中每一個元素 a[i] => n 就是坐標(biāo)系上的一條線段[ (i,0) => (i,x) ]。找出任意兩條線段與 x 軸組成的木桶,可以盛水最大的值。

`

看到題目想了一下就想著兩層循環(huán)去計算,果然就超時了,看了看別人的思路,開始就算出0到最后一個線段組成的木桶的面積,然后找出線段比較短的一條向中間靠攏,如果下一條線段比當(dāng)前線段還短就忽略,反之就繼續(xù)循環(huán)計算。想了想這樣做也是合理的如果下一條線段比當(dāng)前的還短那組成的面積肯定比較小。有了思路就好做了

    var maxArea = function(height) {
        let i = 0, l = height.length -1, res = 0
            
        while(i < l) {
            var h = Math.min(height[i],height[l])
            res = Math.max(res, (l-i) * h)
            if(height[i] < height[l]) {
                while(height[i] <= h && i < l){i++}
            } else {
                while(h >= height[l] && i < l){l--}
            }
        }
        return res
    }
    
Regular Expression Matching

`

實現(xiàn)正則,
"." Matches any single character.
"*" Matches zero or more of the preceding element.
isMatch("aa","a") → false 
isMatch("ab", ".*") → true     
isMatch("aab", "c*a*b") → true

`
剛開始看到這題目還是比較懵的,感覺要判斷的好多,后面從遞歸判斷做就有思路了,從正則表達式入手,先判斷第二位是不是 * ,如果不是就判斷第一位然后截取一位遞歸,如果是就先去除正則前兩位遞歸,不行再判斷第一個是不是相等然后循環(huán)遞歸

    var isMatch = function(s, p) {
        if(p[0] === undefined) return s[0] === undefined
        if (p[1] != "*") {
           if (s[0] === p[0] || (p[0] === "." && s[0] !== undefined)) 
               return isMatch(s.substr(1), p.substr(1))
           else 
               return false
        } else {
            if (isMatch(s, p.substr(2)))return true
            let index = 0
            while(index <= s.length && (s[index] === p[0] || p[0] === ".")){
                if(isMatch(s.substr(++index), p.substr(2))) return true
            }
            return false
        }
    }
    
Is Circular

看到一個面試題,JSON.stringify 是 javascript 的一個方法返回一個json格式的字符串,效果如下

    const obj = {a:1, b:2}
    JSON.stringify(obj) // => "{"a":1,"b":2}"
   

當(dāng)要轉(zhuǎn)化的對象有“環(huán)”存在時(子節(jié)點屬性賦值了父節(jié)點的引用),為了避免死循環(huán),JSON.stringify 會拋出異常,例如:

    var a = [1]
    a.push(a)
    JSON.stringify(a) // => Uncaught TypeError: Converting circular structure to JSON

寫一個函數(shù)判斷參數(shù)是否包含 環(huán),自己想到的是用 map 對象把是對象的值做為鍵存儲值,然后判斷值是否存在來判斷是否回環(huán), 要注意每一次要用一個新的 map 對象,避免同級別相互引用判斷錯誤的情況

    let isCircular = (o) => {
        var flag = false
        const func = (obj, map = new Map()) => {
            map.set(obj, true)
            Object.values(obj).forEach(d=> {
                if (flag) return
                if (typeof d == "object") {
                    if (map.get(d)) {
                        flag = true
                        return
                    } else {
                        let newmap = new Map(map)
                        func(d, newmap)
                    }
                }
            })
        }
        func(o)
        return flag
    }
Submission Details
給一個數(shù)字,寫一個函數(shù)根據(jù)數(shù)字生成所有形式良好的括號組合
2 => ["()()", "(())"]
3 => 
    [
      "((()))",
      "(()())",
      "(())()",
      "()(())",
      "()()()"
    ]

想了一下有一個思路,就是根據(jù) () 里面的包含幾個子 () 來得出所有情況。 比如給出的數(shù)字是5, 那么循環(huán)到5,第n 就有 ( [func(n)的結(jié)果] ) * func(4-n)的結(jié)果

一直想著以一個優(yōu)雅的方式處理邊界的問題,但是想半天都沒結(jié)果,只能寫的丑陋點了。

    var generateParenthesis = function(n) {
        if(n == 0) return []
        if(n == 1) return ["()"]
        let arr = []
        for(let i = 0; i < n; i++) {
            if( i == 0) {
                arr = arr.concat(generateParenthesis([n-1]).map(d => "()" + d ))
            } else if (i == n-1){
                arr = arr.concat(generateParenthesis([n-1]).map(d => "(" + d + ")"))
            } else {
                generateParenthesis(i).forEach(d => {
                    let eachres = "(" + d +")"
                    generateParenthesis(n- i -1).forEach(c => {
                        arr.push(eachres + c)
                    })
                })
            }
        }
        return arr
    };

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/85109.html

Failed to recv the data from server completely (SIZE:0/8, REASON:closed)