本期涉及到的算法技巧爲字符串回溯算法,字符串相乘進位處理等等。前端
LeetCode.93,難度中等面試
給定一個只包含數字的字符串,復原它並返回全部可能的 IP 地址格式。算法
示例:spa
輸入: "25525511135"輸出: ["255.255.11.135", "255.255.111.35"]rest
對於IP地址來講,要注意的點是,地址分爲4段,每一段不能大於255,且每一段若是開頭是0的話那隻能有一位。code
考慮能夠用回溯的思路,好比第一段能夠在二、2五、255裏面選,當第一段是2的時候,第二段能夠在五、5五、552(超過255不符合要求)裏選,第二段是5的時候,第三段能夠在五、5二、525(超過255不符合要求)裏選,第三段是5的時候,第四段能夠在二、2五、255裏選,其餘狀況能夠以此類推。ip
代碼以下:rem
/** * @param {string} s * @return {string[]} */ const restoreIpAddresses = function(s) { let res = []; backtrack(0, '', s, 4, res); return res; }; /* pos:當前遍歷到的位置 ip:當前構造出的ip s:字符串 flag:當前是在處理第幾段,ip地址共4端 */ const backtrack = function(pos, ip, s, flag, res) { if(flag < 0) return; if(pos === s.length && flag === 0) { res.push(ip.substring(0, ip.length-1)); return; } for(let index = pos; index < pos+3;index++) { // 0只能做爲IP中的一段,不能出現xx.01.xx.xx這樣的,因此break if(index === pos && s[index] === '0') { backtrack(index + 1, ip + '0.', s, flag-1, res); break; } if(parseInt(s.substring(pos, index+1)) <= 255) { backtrack(index+1, ip + s.substring(pos, index+1) + '.', s, flag-1, res); } } }
LeetCode.67,難度簡單,常見於騰訊面試字符串
給定兩個二進制字符串,返回他們的和(用二進制表示)。string
輸入爲非空字符串且只包含數字 1 和 0。
示例 1:
輸入: a = "11", b = "1"輸出: "100"
示例 2:
輸入: a = "1010", b = "1011"輸出: "10101"
依然是個字符串按位相加的例子,不過要注意二進制的加法進位邏輯和兩個字符串不必定會同樣長。
代碼以下:
/** * @param {string} a * @param {string} b * @return {string} */ var addBinary = function(a, b) { if(a === "") return b; if(b === "") return a; let index1 = a.length-1; let index2 = b.length-1; let res = ""; let carry = false; // 進位 while(index1 >= 0 && index2 >= 0) { let cur = "0"; if(a[index1] === "1" && b[index2] === "1") { if(carry) { cur = "1"; } else { cur ="0"; } carry = true; } else if (a[index1] === "1" || b[index2] === "1") { if(carry) { cur = "0"; carry = true; } else { cur = "1"; } } else { if(carry) { cur = "1"; carry = false; } else { cur = "0"; } } index1--; index2--; res = cur + res; } let index = index1 >= 0 ? index1 : index2; let num = index1 >= 0 ? a : b; while(index >= 0) { let cur = ""; if(num[index] === "1") { if(carry) { cur = "0"; carry = true; } else { cur = "1"; carry = false; } } else { cur = carry ? "1" : "0"; carry = false; } index--; res = cur + res; } if(carry) { res = "1" + res; } return res; };
感興趣可關注個人公衆號——前端亞古獸