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”

未完待续...

内容来源于网络如有侵权请私信删除

文章来源: 博客园

原文链接: https://www.cnblogs.com/zh1q1/p/15245446.html

你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!

相关课程