LeetCode刷題筆記
題目來源:力扣(LeetCode)
分割平衡字串
在一個 平衡字串 中,'L' 和 'R' 字符的數量是相同的,
給你一個平衡字串 s,請你將它分割成盡可能多的平衡字串,
注意:分割得到的每個字串都必須是平衡字串,
回傳可以通過分割得到的平衡字串的 最大數量 ,
// 思路:遍歷 s 時用一個變數 d 維護 L 和 R 字符的數量之差,當 d=0 時就說明找到了一個平衡字串,將答案加一
var balancedStringSplit = function(s) {
let ans = 0, count = 0
for(key of s) {
key === 'L' ? ans++ : ans--
if(ans === 0) count++
}
return count
};
更多解法可查看題解 “分割平衡字串 | LeetCode”
獨一無二的出現次數
給你一個整數陣列 arr,請你幫忙統計陣列中每個數的出現次數
如果每個數的出現次數都是獨一無二的,就回傳 true;否則回傳 false
// 思路:統計字符出現字數,再判斷字數是否有相同項
var uniqueOccurrences = function(arr) {
const obj = {}
for(key of arr) !obj[key] ? obj[key]=1 : obj[key]++
// 若有重復項,new Set()會去重,size必然發生改變
return Object.values(obj).length == new Set(Object.values(obj)).size
};
更多解法可查看題解 “獨一無二的出現次數 | LeetCode”
兩數之和
給定一個整數陣列 nums和一個整數目標值 target,請你在該陣列中找出 和為目標值 target 的那兩個整數,并回傳它們的陣列下標
// 思路:先求出匹配項,判斷匹配項是否在Map里,有就回傳兩個值索引,沒有就Map.set
var twoSum = function(nums, target) {
const map = new Map()
for(i in nums) {
if(map.has(target - nums[i])) return [map.get(target - nums[i]), i]
map.set(nums[i], i)
}
return []
};
// 栗子:nums=[2,7,1] targer=9
1.nums[i]=2,匹配項即為 9-2=7,此時Map.has(7)為false,即Map.set(2, 0) // 2是值,0是索引
2.nums[i]=7,匹配項即為 9-7=2,此時Map.has(2)為true,即有匹配項,回傳[0, 1] // Map.get(2)得到的就是數值2索引
更多解法可查看題解 “兩數之和 | LeetCode”
回文數
給你一個整數 x ,如果 x 是一個回文整數,回傳 true ;否則,回傳 false ,
回文數是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數,例如,121 是回文,而 123 不是,
// 基礎解法:利用字串對比
var isPalindrome = function(x) {
//負數必然不回文 -121 -> 121-
if (x < 0) return false;
//個位數必然回文 2 -> 2
if (x < 10) return true;
//x不為0,但個位是0,必然不回文 120 -> 021
if (x != 0 && x % 10 === 0) return false;
return x.toString() === x.toString().split('').reverse().join('')
};
更多解法可查看題解 “回文數 | LeetCode”
整數反轉
給你一個 32 位的有符號整數 x ,回傳將 x 中的數字部分反轉后的結果,
如果反轉后整數超過 32 位的有符號整數的范圍[2^31, 2^31-1] ,就回傳 0,
// 2^31-1=2147483647,-2^31=-2147483648
// 思路:利用陣列反轉實作,負數加負號回傳,正數直接回傳即可
var reverse = function(x) {
let rsNum = parseInt(String(x).split('').reverse().join(''))
if(Math.pow(-2, 31) <= rsNum && rsNum <= (Math.pow(2, 31) - 1)) return x < 0 ? -rsNum : rsNum
return 0
};
更多解法可查看題解 “整數反轉 | LeetCode”
羅馬數字轉整數
羅馬數字包含以下七種字符: I, V, X, L,C,D 和 M,
字符 數值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
例如, 羅馬數字 2 寫做II,即為兩個并列的 1,12 寫做XII,即為X+II, 27 寫做XXVII, 即為XX+V+II,
通常情況下,羅馬數字中小的數字在大的數字的右邊,但也存在特例,例如 4 不寫做IIII,而是IV,數字 1 在數字 5 的左邊,所表示的數等于大數 5 減小數 1 得到的數值 4 ,同樣地,數字 9 表示為IX,
這個特殊的規則只適用于以下六種情況:
I可以放在V(5) 和X(10) 的左邊,來表示 4 和 9,
X可以放在L(50) 和C(100) 的左邊,來表示 40 和90,
C可以放在D(500) 和M(1000) 的左邊,來表示400 和900,
給定一個羅馬數字,將其轉換成整數,輸入確保在 1到 3999 的范圍內
// 解題思路:先映射符號和值,然后對字串從左到右來,如果當前字符代表的值 大于 其右邊的值,就加上該值;否則就減去該值,以此類推到最右邊的數,最終得到的結果即是答案,
/**
* @param {string} s
* @return {number}
*/
function formatRoman(char) {
let value = https://www.cnblogs.com/zh1q1/p/null
switch(char) {
case'I':
value = https://www.cnblogs.com/zh1q1/p/1
break
case'V':
value = https://www.cnblogs.com/zh1q1/p/5
break
case'X':
value = https://www.cnblogs.com/zh1q1/p/10
break
case'L':
value = https://www.cnblogs.com/zh1q1/p/50
break
case'C':
value = https://www.cnblogs.com/zh1q1/p/100
break
case'D':
value = https://www.cnblogs.com/zh1q1/p/500
break
case'M':
value = https://www.cnblogs.com/zh1q1/p/1000
break
}
return value
}
var romanToInt = function(s) {
let count = 0
for(let i = 0; i <= s.length - 1; i++) {
// String.charAt([index]) 回傳指定位置的字符
let curCharValue = formatRoman(s.charAt(i))
let nextCharValue = formatRoman(s.charAt(i+1))
curCharValue < nextCharValue ? count -= curCharValue : count += curCharValue
}
return count
};
更多解法可查看題解 “羅馬數字轉整數 | LeetCode”
未完待續...
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/299095.html
標籤:JavaScript
