分割平衡字符串
在一个 平衡字符串 中,'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”