摘要:實現(xiàn)優(yōu)化思路直接一路暴力下來,免去了預(yù)先定義數(shù)組及從二維數(shù)組中取值,故速度空間都得到節(jié)省。初始思路創(chuàng)建,雙循環(huán)組裝出實際文件路徑,并將內(nèi)容作為,數(shù)組為放入相同數(shù)組不斷插入,最后取整合出目標二維數(shù)組。
709 toLowerCase
難度:easy
標簽:ASCII碼
初始思路:大寫字母ASCII范圍65-90,小寫字母ASCII范圍97-122,func_大寫轉(zhuǎn)小寫即為val+32
resultStr = "" for(str) { if (str[i] in 大寫字母ASCII碼范圍) { resultStr + = func_大寫轉(zhuǎn)小寫(str[i]) } else { resultStr += str[i] } } return resultStr
復(fù)雜度:時間 O(N), 空間 O(1)
優(yōu)化:
第一次優(yōu)化:使用正則判斷字符是否處于大寫字母ASCII碼范圍,只有處于該范圍內(nèi)才進行進行轉(zhuǎn)ASCII處理,結(jié)果復(fù)雜度不變,減少了轉(zhuǎn)換ASCII碼的次數(shù)。實現(xiàn)如下:
var toLowerCase = function(str) { let resultStr = ""; for (let i=0, strLen=str.length; i804 uniqueMorseRepresentations 難度:easy
初始思路:使用Set存儲計算結(jié)果
復(fù)雜度: 時間:雙for=>O(n^2), 空間:最差情況即全部字符串Morse碼不同時為O(n)
實現(xiàn):
var uniqueMorseRepresentations = function(words) { let morseArr = [".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."]; let set = new Set(); for (let i=0, wordsLen=words.length; i929 numUniqueEmails 難度:easy
標簽:Set 正則
題意分析:只需關(guān)注@前面部分,遇.去掉,遇+忽略其后字符;
初始思路:基于@分割,前面部分正則去點,然后取加號之前的部分,組合放入set去重;
復(fù)雜度:時間O(n),空間O(n)
實現(xiàn)
var numUniqueEmails = function(emails) { let set = new Set(); for (let i=0, emailsLen=emails.length; i-1) { localStr=localStr.slice(0, indexAdd); } set.add(localStr+"@"+tempArr[1]); } return set.size; };
首次優(yōu)化:先基于加號分割再正則去點,組合操作一起提高可讀性;
實現(xiàn):
var numUniqueEmails = function(emails) { let set = new Set(); for (let i=0, emailsLen=emails.length; i22 generateParenthesis 難度: medium
標簽:遞歸
初始思路:創(chuàng)建校驗函數(shù),生成所有情況的組合后逐個校驗;
復(fù)雜度:時間、空間都 N!
優(yōu)化:分析正確組合結(jié)果生成規(guī)律,只生成符合要求的結(jié)果;
左右括號規(guī)則(每次新增都有添加左括號和添加右括號兩種選擇,故重點在于了解不得添加情況):
1 . 不可加左括號:左括號數(shù)量===Num 2 . 不可加右括號:首位、左右括號數(shù)量相等時思路:用函數(shù)不斷根據(jù)左右括號規(guī)則運行添加,最終生成目標結(jié)果;
復(fù)雜度:時間O(n)、空間O(n)
實現(xiàn):
var generateParenthesis = function(n) { let arr = []; if (n===0) return []; calcFunc(arr, n, 0, 0, ""); return arr; }; function calcFunc(resultArr, N, leftNum, rightNum, currStr) { if (leftNum+rightNum === N*2) { resultArr.push(currStr); return; } if (leftNum !== N) { calcFunc(resultArr, N, leftNum+1, rightNum, currStr+"("); } if (currStr !== "" && leftNum !== rightNum) { calcFunc(resultArr, N, leftNum, rightNum+1, currStr+")"); } }657 judgeCircle難度:easy
初始思路:放置兩個計數(shù)器,for字符串并增減計數(shù)器,最終計數(shù)器歸0則True;
復(fù)雜度:時間O(n) 空間O(1)
實現(xiàn):
var judgeCircle = function(moves) { let [x, y] = [0, 0]; for (let i=0, movesLen=moves.length; i
思路二:使用Hashmap做需要字符數(shù)量的存儲,及最后用以對比
復(fù)雜度:時間O(n) 空間O(1)
實現(xiàn):
let map = new Map(); map.set("U", 0); map.set("D", 0); map.set("L", 0); map.set("R", 0); for (let i=0, movesLen=moves.length; i344 reverseString 難度:easy
題意分析:原地翻轉(zhuǎn)數(shù)組并輸出,空間復(fù)雜度需為O(1)
思路:首尾ij向中間推進并交換,i
890 findAndReplacePattern復(fù)雜度:時間O(n), 空間O(1)
實現(xiàn):
var reverseString = function(s) { let [i, j] = [0, s.length-1]; while (i難度:medium
題意分析:word和pattern的每個字母能構(gòu)成不重復(fù)映射即滿足條件
初始思路:for words, 再for pattern.length, 當map不存在當前字母則添加,當map存在當前字母時比對,成功繼續(xù),失敗next word
Tip:隱蔽規(guī)則:“沒有兩個字母映射到同一個字母”, 即字母列表&對應(yīng)pattern列表長度應(yīng)始終一致(借助set與map長度對比)
復(fù)雜度:時間O(n),空間O(n)
實現(xiàn):
var findAndReplacePattern = function(words, pattern) { let resultArr = []; let patternLen = pattern.length; for(let i=0, wordsLen=words.length; i
圍觀:
排名第一:遍歷pattern用pattern.indexOf(item)獲取下標數(shù)組,使words也按照這個方法對比;
其他:大同小異封裝方法,只封裝一次用以檢測足矣;
總結(jié):本題其實是:"如何制定對比word和pattern的規(guī)則",注意點是一一映射
557 reverseWords難度:easy
題意分析:"注意"中提到,"每個單詞由單個空格分隔,且字符串中不會有任何額外的空格",于是解題只需要先基于單個空格作分割,然后依次反轉(zhuǎn)每個單詞就行(時間復(fù)雜度:O(n^2),空間復(fù)雜度:O(n^2))
實現(xiàn):
var reverseWords = function(s) { let resultS = "" let arr = s.split(" ") for (let i=0, arrLen=arr.length; i
思路二:遍歷字符串并處理每段單詞(記錄開始位,遇到【下位為空格or最后一位】記錄結(jié)束位&處理,處理完成后記錄結(jié)束位+2為起始位),時間空間復(fù)雜度不變,減少了split("").reverse().join("")造成的空間損耗,實現(xiàn)如下:
var reverseWords = function(s) { let arr = s.split("") let [startIndex, endIndex] = [0, 0] for (let i=0, arrLen=arr.length; i537 complexNumberMultiply 難度:medium
題意分析:根據(jù)給定的兩個格式為a+bi的復(fù)數(shù)字符串,計算出a+bi格式的結(jié)果字符串
思路:使用字符串分割或者正則提取輸入字符串的a和b值,計算得出結(jié)果a和b值,填充入模板字符串并返回
復(fù)雜度:時空均O(1)
實現(xiàn):
var complexNumberMultiply = function(a, b) { let [aArr, bArr] = [a.split("+"), b.split("+")] let [a1, b1] = [aArr[0], aArr[1].split("i")[0]] let [a2, b2] = [bArr[0], bArr[1].split("i")[0]] let [aResult, bResult] = [a1*a2-b1*b2, a1*b2+a2*b1] return `${aResult}+${bResult}i` }521 findLUSlength難度:easy
題意分析:這道題著重題意分析,目標是獲取最長特殊序列(定義:獨有的最長子序列)。可得兩字符串不相同時必定不互為子序列,故取長者返回;若相等則互為子序列而非最長特殊序列,即不存在,返回-1
實現(xiàn):
var findLUSlength = function(a, b) { if (a === b) { return -1 } else { return Math.max(a.length, b.length) } };791 customSortString難度:medium
題意解析:使T按照S的順序做排列,S中不存在的字符可隨意排列
思路一:暴力思路(不推薦)。切分S形成順序數(shù)組,并以此形成char+count的Map。for T并加入Map,for SArr按序形成結(jié)果字符串
特點:思路簡單,空間占用多,代碼繁瑣
復(fù)雜度:時間O(T), 空間O(S+2T)
實現(xiàn):
var customSortString = function(S, T) { let orderArr = S.split("") let countMap = new Map() let resultS = "" for (let i=0, SLen=S.length; i
思路二:用Map存儲S順序,然后用數(shù)組存儲每個S位置所對應(yīng)的所有T字符,整合輸出
特點:思路&代碼清晰
實現(xiàn):
var customSortString = function(S, T) { let SLen = S.length let map = new Map() let resultArr = Array.from({length: SLen+1}, ()=>"") for (let i=0; i791 numSpecialEquivGroups 難度:easy
題意分析:目標是將數(shù)組內(nèi)特殊等價的字符串歸納為一組并求總數(shù)組長度。判斷是否為特殊等價的依據(jù)是,奇位字符相同&偶位字符相同(忽略順序)。
思路:for數(shù)組,取得item并將其分開為奇字符串及偶字符串,sort兩個字符串并整合放入Set中,Set長度即結(jié)果。
實現(xiàn)
var numSpecialEquivGroups = function(A) { let set = new Set(); let itemSize = A[0].length; for (let i=0, ALen=A.length; i12. intToRoman 難度:medium
題意分析:將一個0~3999的數(shù)轉(zhuǎn)換為羅馬數(shù)字
初始思路:枚舉0~9(間隔1)、10-90(間隔10)、100~900(間隔100)、1000-3000(間隔1000), 然后循環(huán)取數(shù)字最后一位取得對應(yīng)字符串,累加結(jié)果。
實現(xiàn):
var intToRoman = function(num) { let fixedArr = [ ["", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"], ["", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"], ["", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"], ["", "M", "MM", "MMM"] ]; let resultStr = ""; let count = 0; while (num!==0) { resultStr = fixedArr[count++][num%10] + resultStr num = Math.floor(num/10) } return resultStr; };
優(yōu)化思路:直接一路暴力if下來,免去了預(yù)先定義數(shù)組及從二維數(shù)組中取值,故速度空間都得到節(jié)省。
實現(xiàn):
var intToRoman = function(num) { let resultStr = "" if (num>=1000) { for (let i=0, len=Math.floor(num/1000); i=900) { resultStr += "CM" num -= 900 } if (num>=500) { resultStr += "D" num -= 500 } if (num>=400) { resultStr += "CD" num -= 400 } if (num>=100) { for (let i=0, len=Math.floor(num/100); i =90) { resultStr += "XC" num -= 90 } if (num>=50) { resultStr += "L" num -= 50 } if (num>=40) { resultStr += "XL" num -= 40 } if (num>=10) { for (let i=0, len=Math.floor(num/10); i =9) { resultStr += "IX" num -= 9 } if (num>=5) { resultStr += "V" num -= 5 } if (num>=4) { resultStr += "IV" num -= 4 } if (num>=1) { for (let i=0; i 13. romanToInt 難度:easy
題意分析:將羅馬數(shù)字轉(zhuǎn)換為數(shù)字
思路:創(chuàng)建對象映射單個羅馬數(shù)字與數(shù)值的關(guān)系,遍歷羅馬數(shù)字字符串,比較第 i 位與第 i+1 位的值,如果第 i 位的值小于第 i+1 位,則額外計算,其他情況直接計算獲得結(jié)果。
實現(xiàn):
var romanToInt = function(s) { let fixedObj = { "": 0, "I": 1, "V": 5, "X": 10, "L": 50, "C": 100, "D": 500, "M": 1000 }; let result = 0; for (let i=0; i1016. queryStringfixedObj[s[i]]) { result += fixedObj[s[i+1]] - fixedObj[s[i++]]; } else { result += fixedObj[s[i]]; } } return result; }; 難度:medium
題意解析:確認 1~N 的每個數(shù)的二進制表示都是 S 的子串。
思路:編寫一個數(shù)字轉(zhuǎn)二進制字符串方法(避開32位限制),for 數(shù)組轉(zhuǎn)換結(jié)果,確定是否在 S 中都存在。(由于只要一個二進制字符串不匹配就退出故實際運行時間應(yīng)該是更低的)
復(fù)雜度: 時間 O(n), 空間 O(N)
實現(xiàn):
var queryString = function(S, N) { for (let i=0; i<=N; ++i) { if (S.indexOf(num2bin(i)) === -1) { return false; } } return true; }; function num2bin (num){ let binStr = ""; while(num>0) { binStr = num%2 + binStr; num = Math.floor(num/2); } return binStr; }49. groupAnagrams難度:medium
題意解析:將字符串數(shù)組中,字母組成相同的詞歸納到同一數(shù)組內(nèi),再合并進數(shù)組。
初始思路:遍歷數(shù)組,對item進行 sort 并作為 map 的key,value 為計數(shù)器的計數(shù)(也是結(jié)果數(shù)組的 index),根據(jù)map.has(key)的情況,數(shù)組分別尾增新數(shù)組或在特定數(shù)組中尾插單詞。
復(fù)雜度:時間 O(n), 空間復(fù)雜度O(n)
實現(xiàn):
var groupAnagrams = function(strs) { let map = new Map(); let resultArr = []; let count = 0; for (let i=0, arrLen=strs.length; i
優(yōu)化思路:用 map 存放 a-z 映射到26個質(zhì)數(shù)的鍵值對,用每次"拆分 item 對獲得乘積" 替換 "sort item"的過程
復(fù)雜度:同上. 中間的從 item 獲取 key 的過程被簡化了。
實現(xiàn):
var groupAnagrams = function(strs) { var fixedObj={ a:2, b:3, c:5, d:7, e:11, f:13, g:17, h:19, i:23, j:29, k:31, l:37, m:41, n:43, o:47, p:53, q:59, r:61, s:67, t:71, u:73, v:79, w:83, x:89, y:97, z:101 } let map = new Map(); let resultArr = []; let count = 0; for (let i=0, arrLen=strs.length; i824. toGoatLatin 難度:easy
題意解析:句子可被空格分割為 n 個單詞,每個單詞處理如下:
單詞開頭為元音則尾部+ma+a*(單詞在數(shù)組中的下標+1);
非元音開頭則單詞摘出開頭+開頭+ma+a*(單詞在數(shù)組中的下標+1);
解題思路:按照題意編寫代碼
實現(xiàn):
var toGoatLatin = function(S) { let arr = S.split(" "); for (let i=0, arrLen=arr.length; i609.findDuplicate 難度:medium
題意解析:給定一個二維數(shù)組,每個子數(shù)組第一個元素為根目錄,第二到第 n 個元素為文件+文件內(nèi)容,目標是將相同文本內(nèi)容的文件路徑名放入同一數(shù)組。
初始思路:創(chuàng)建 map,雙 for 循環(huán)組裝出實際文件路徑,并將內(nèi)容作為key,數(shù)組為 value 放入 map, 相同數(shù)組不斷插入 value,最后取 map.values() 整合出目標二維數(shù)組。
實現(xiàn):
var findDuplicate = function(paths) { let map = new Map(); for (let i=0, pathsLen=paths.length; i1) { resultArr.push(value) } } return resultArr };
優(yōu)化思路:
優(yōu)化點1:將中間的"兩次切分字符串"改為"字符串截取",減少了空間消耗;
優(yōu)化點2:最后從 map.values()生產(chǎn)目標二維數(shù)組的過程使用 ES6語法的 Array.from + filter 代替,提高執(zhí)行效率(副作用是加大內(nèi)存消耗);
實現(xiàn):
var findDuplicate = function(paths) { let map = new Map(); for (let i=0, pathsLen=paths.length; i49. groupAnagramsitem.length>1); }; 難度:medium
題意解析:從包含數(shù)個字符串的數(shù)組中獲取包含字母完全相同的字符串。
初始解法:通過鍵值對方法,將每個字符串的字母排序形成鍵,鍵相同的字符串放到一起。
復(fù)雜度:時間O(n)、空間O(n)
實現(xiàn):
var groupAnagrams = function(strs) { let map = new Map(); for (let i=0, strsLen=strs.length; i788. rotatedDigits 難度:easy
題意解析:計算 1-》N 中間的數(shù)字有多少個是好數(shù),好數(shù)的定位為180旋轉(zhuǎn)后仍為數(shù)字且不與原數(shù)相等。即滿足數(shù)字為好數(shù)的前提是:
1)翻轉(zhuǎn)后所有數(shù)字有效(0,1,2,5,6,8,9);
2)至少一個數(shù)字為不同數(shù);(2,5,6,9)
初始解法:所有數(shù)均為有效=》沒有無效數(shù)字=》不包含(3,4,7), 故只要滿足包含(2,5,6,9)且不包含(3,4,7)即符合要求,用正則可以簡單得出結(jié)果。
實現(xiàn):
var rotatedDigits = function(N) { let count = 0; for (let i=1, len=N+1; iTo Be Continue~
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/102943.html
摘要:項目如何進行多人協(xié)作開發(fā)聲明本文不介紹的基本用法,需要讀者對命令使用有一定的了解現(xiàn)在,大部分項目都是用來管理代碼的,但當項目變大多人協(xié)作時,的使用就變得復(fù)雜了,這時就需要在使用的流程上來思考如何更優(yōu)的使用。 web 項目如何進行 git 多人協(xié)作開發(fā) 聲明:本文不介紹 git 的基本用法,需要讀者對 git、git 命令、git 使用有一定的了解 現(xiàn)在,大部分項目都是用 git 來管理...
摘要:項目如何進行多人協(xié)作開發(fā)聲明本文不介紹的基本用法,需要讀者對命令使用有一定的了解現(xiàn)在,大部分項目都是用來管理代碼的,但當項目變大多人協(xié)作時,的使用就變得復(fù)雜了,這時就需要在使用的流程上來思考如何更優(yōu)的使用。 web 項目如何進行 git 多人協(xié)作開發(fā) 聲明:本文不介紹 git 的基本用法,需要讀者對 git、git 命令、git 使用有一定的了解 現(xiàn)在,大部分項目都是用 git 來管理...
摘要:項目如何進行多人協(xié)作開發(fā)聲明本文不介紹的基本用法,需要讀者對命令使用有一定的了解現(xiàn)在,大部分項目都是用來管理代碼的,但當項目變大多人協(xié)作時,的使用就變得復(fù)雜了,這時就需要在使用的流程上來思考如何更優(yōu)的使用。 web 項目如何進行 git 多人協(xié)作開發(fā) 聲明:本文不介紹 git 的基本用法,需要讀者對 git、git 命令、git 使用有一定的了解 現(xiàn)在,大部分項目都是用 git 來管理...
摘要:前言從開始寫相關(guān)的博客到現(xiàn)在也蠻多篇了。而且當時也沒有按順序?qū)懍F(xiàn)在翻起來覺得蠻亂的。可能大家看著也非常不方便。所以在這里做個索引嘻嘻。順序整理更新更新更新更新更新更新更新更新更新更新更新更新更新更新更新更新 前言 從開始寫leetcode相關(guān)的博客到現(xiàn)在也蠻多篇了。而且當時也沒有按順序?qū)憽F(xiàn)在翻起來覺得蠻亂的。可能大家看著也非常不方便。所以在這里做個索引嘻嘻。 順序整理 1~50 1...
摘要:參考文章持續(xù)集成持續(xù)集成指的是,頻繁地一天多次將代碼集成到主干。說過,持續(xù)集成并不能消除,而是讓它們非常容易發(fā)現(xiàn)和改正。持續(xù)交付可以看作持續(xù)集成的下一步。持續(xù)部署的前提是能自動化完成測試構(gòu)建部署等步驟。 showImg(https://segmentfault.com/img/remote/1460000018877229); 基本概念 敏捷開發(fā) 什么是敏捷開發(fā)? 敏捷開發(fā)(Agile...
閱讀 2491·2021-11-25 09:43
閱讀 2585·2021-11-16 11:50
閱讀 3280·2021-10-09 09:44
閱讀 3193·2021-09-26 09:55
閱讀 2834·2019-08-30 13:50
閱讀 1026·2019-08-29 13:24
閱讀 2068·2019-08-26 11:44
閱讀 2790·2019-08-26 11:37