- A+
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索引
回文数
给你一个整数 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('') };
整数反转
给你一个 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 };
罗马数字转整数
罗马数字包含以下七种字符: 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 = null switch(char) { case 'I': value = 1 break case 'V': value = 5 break case 'X': value = 10 break case 'L': value = 50 break case 'C': value = 100 break case 'D': value = 500 break case 'M': value = 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”