摘要:題目全部用做的,基本上每天一題的節(jié)奏。題目這里記錄自己對(duì)一些題目的思路和想法數(shù)字回文,說不能用額外的空間一下子懵逼了,第一概念就是換成字符串比較,但是感覺這樣子做就沒有意義了。找出任意兩條線段與軸組成的木桶,可以盛水最大的值。
前言
原文地址
無意間發(fā)現(xiàn) LeetCode 這個(gè)網(wǎng)站,一下子就陷進(jìn)去了,大學(xué)時(shí)候看舍友參加 acm 一天到晚刷題,對(duì)算法總有點(diǎn)特殊的情懷。本以為我永遠(yuǎn)是接觸不到這個(gè)了,沒想到 leetcode 卻讓我感覺到 Accepted 這個(gè)單詞的特殊魅力。
個(gè)人首先自己并不是為了找工作去刷題的,純粹享受做題的過程和ac的快感。題目全部用 JavaScript 做的,基本上每天一題的節(jié)奏。開始總是想著怎么把答案解出來就好,經(jīng)常 TLE ,感覺一路做下來自己慢慢會(huì)考慮復(fù)雜度,邏輯嚴(yán)謹(jǐn)性也在逐步加強(qiáng),對(duì)特殊值的考慮越來越多,相比于算法能力的提升我更欣喜看到自己邏輯嚴(yán)謹(jǐn)性加強(qiáng),感覺這對(duì)自己后面的道路幫助會(huì)很大。
題目這里記錄自己對(duì)一些題目的思路和想法
Palindrome Number`
1 => true; 21 => false; 303 => true;
`
數(shù)字回文,說不能用額外的空間一下子懵逼了,第一概念就是換成字符串比較,但是感覺這樣子做就沒有意義了。看了別人思路發(fā)現(xiàn)給的數(shù)字每次取 10 的余數(shù)拼起來正好是數(shù)字倒過來寫。如果只取出一半,原數(shù)字也舍棄一半 正好就是回文的兩個(gè)內(nèi)容。有了思路就好做了判斷下特殊條件,比較最后兩個(gè)數(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
`
給定一個(gè)數(shù)組,想象成一個(gè)二位坐標(biāo)系,數(shù)組中每一個(gè)元素 a[i] => n 就是坐標(biāo)系上的一條線段[ (i,0) => (i,x) ]。找出任意兩條線段與 x 軸組成的木桶,可以盛水最大的值。
`
看到題目想了一下就想著兩層循環(huán)去計(jì)算,果然就超時(shí)了,看了看別人的思路,開始就算出0到最后一個(gè)線段組成的木桶的面積,然后找出線段比較短的一條向中間靠攏,如果下一條線段比當(dāng)前線段還短就忽略,反之就繼續(xù)循環(huán)計(jì)算。想了想這樣做也是合理的如果下一條線段比當(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
`
實(shí)現(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
`
剛開始看到這題目還是比較懵的,感覺要判斷的好多,后面從遞歸判斷做就有思路了,從正則表達(dá)式入手,先判斷第二位是不是 * ,如果不是就判斷第一位然后截取一位遞歸,如果是就先去除正則前兩位遞歸,不行再判斷第一個(gè)是不是相等然后循環(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
看到一個(gè)面試題,JSON.stringify 是 javascript 的一個(gè)方法返回一個(gè)json格式的字符串,效果如下
const obj = {a:1, b:2} JSON.stringify(obj) // => "{"a":1,"b":2}"
當(dāng)要轉(zhuǎn)化的對(duì)象有“環(huán)”存在時(shí)(子節(jié)點(diǎn)屬性賦值了父節(jié)點(diǎn)的引用),為了避免死循環(huán),JSON.stringify 會(huì)拋出異常,例如:
var a = [1] a.push(a) JSON.stringify(a) // => Uncaught TypeError: Converting circular structure to JSON
寫一個(gè)函數(shù)判斷參數(shù)是否包含 環(huán),自己想到的是用 map 對(duì)象把是對(duì)象的值做為鍵存儲(chǔ)值,然后判斷值是否存在來判斷是否回環(huán), 要注意每一次要用一個(gè)新的 map 對(duì)象,避免同級(jí)別相互引用判斷錯(cuò)誤的情況
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
給一個(gè)數(shù)字,寫一個(gè)函數(shù)根據(jù)數(shù)字生成所有形式良好的括號(hào)組合 2 => ["()()", "(())"] 3 => [ "((()))", "(()())", "(())()", "()(())", "()()()" ]
想了一下有一個(gè)思路,就是根據(jù) () 里面的包含幾個(gè)子 () 來得出所有情況。 比如給出的數(shù)字是5, 那么循環(huán)到5,第n 就有 ( [func(n)的結(jié)果] ) * func(4-n)的結(jié)果 。
一直想著以一個(gè)優(yōu)雅的方式處理邊界的問題,但是想半天都沒結(jié)果,只能寫的丑陋點(diǎn)了。
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)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/85109.html
摘要:每天會(huì)折騰一道及以上題目,并將其解題思路記錄成文章,發(fā)布到和微信公眾號(hào)上。三匯總返回目錄在月日月日這半個(gè)月中,做了匯總了數(shù)組知識(shí)點(diǎn)。或者拉到本文最下面,添加的微信等會(huì)根據(jù)題解以及留言內(nèi)容,進(jìn)行補(bǔ)充,并添加上提供題解的小伙伴的昵稱和地址。 LeetCode 匯總 - 2019/08/15 Create by jsliang on 2019-08-12 19:39:34 Recently...
摘要:微信公眾號(hào)記錄截圖記錄截圖目前關(guān)于這塊算法與數(shù)據(jù)結(jié)構(gòu)的安排前。已攻略返回目錄目前已攻略篇文章。會(huì)根據(jù)題解以及留言內(nèi)容,進(jìn)行補(bǔ)充,并添加上提供題解的小伙伴的昵稱和地址。本許可協(xié)議授權(quán)之外的使用權(quán)限可以從處獲得。 Create by jsliang on 2019-07-15 11:54:45 Recently revised in 2019-07-15 15:25:25 一 目錄 不...
摘要:月下半旬攻略道題,目前已攻略題。目前簡(jiǎn)單難度攻略已經(jīng)到題,所以后面會(huì)調(diào)整自己,在刷算法與數(shù)據(jù)結(jié)構(gòu)的同時(shí),攻略中等難度的題目。 Create by jsliang on 2019-07-30 16:15:37 Recently revised in 2019-07-30 17:04:20 7 月下半旬攻略 45 道題,目前已攻略 100 題。 一 目錄 不折騰的前端,和咸魚有什么區(qū)別...
摘要:辛苦面試了好多家大小公司,在面試中也發(fā)現(xiàn)了自己的很多不足,也有很多的感悟,這里記錄一下,為的是之后的學(xué)習(xí)與提高更有針對(duì)性。面試中的的題目就是準(zhǔn)備不足的充分表現(xiàn)。其實(shí)大部分面試官都不會(huì)給什么反饋,只是機(jī)械地聽答案,記錄評(píng)價(jià)。 辛苦面試了好多家大小公司,在面試中也發(fā)現(xiàn)了自己的很多不足,也有很多的感悟,這里記錄一下,為的是之后的學(xué)習(xí)與提高更有針對(duì)性。 關(guān)于刷題 LeetCode 要刷,面試...
閱讀 2586·2021-10-25 09:45
閱讀 1246·2021-10-14 09:43
閱讀 2304·2021-09-22 15:23
閱讀 1529·2021-09-22 14:58
閱讀 1939·2019-08-30 15:54
閱讀 3547·2019-08-30 13:00
閱讀 1361·2019-08-29 18:44
閱讀 1578·2019-08-29 16:59