LeetCode刷题笔记-简单入门题

  • A+
所属分类:Web前端
摘要

题目来源:力扣(LeetCode)在一个 平衡字符串 中,’L’ 和 ‘R’ 字符的数量是相同的。


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 = 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”

未完待续...