[ 第 79 场力扣双周赛 I ] 6083. 判断一个数的数字计数是否等于数位的值

201 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情

每日刷题 2022.05.31

题目

  • 给你一个下标从 0 开始长度为 n 的字符串 num ,它只包含数字。
  • 如果对于 每个 0 <= i < n 的下标 i ,都满足数位 i 在 num 中出现了 num[i]次,那么请你返回 true ,否则返回 false 。

示例

  • 示例1
输入:num = "1210"
输出:true
解释:
num[0] = '1' 。数字 0num 中出现了一次。
num[1] = '2' 。数字 1num 中出现了两次。
num[2] = '1' 。数字 2num 中出现了一次。
num[3] = '0' 。数字 3num 中出现了零次。
"1210" 满足题目要求条件,所以返回 true
  • 示例2
输入:num = "030"
输出:false
解释:
num[0] = '0' 。数字 0 应该出现 0 次,但是在 num 中出现了一次。
num[1] = '3' 。数字 1 应该出现 3 次,但是在 num 中出现了零次。
num[2] = '0' 。数字 2num 中出现了 0 次。
下标 01 都违反了题目要求,所以返回 false

提示

  • n == num.length
  • 1 <= n <= 10
  • num 只包含数字。

解题思路

  • 判断下标i是否在num数组中出现了num[i]
  • 解题方法:使用map集合记录num数组中每个数出现的次数,再通过遍历num 数组,查看下标i 对应 map中的key,num[i] 对应 map中的value,这两个是否是相同的。
  • (比赛的时候,遗漏了情况)有可能这个下标i根本就没有在num数组中出现过,也就是统计的map集合中就没有这个数,但是当它等于0的时候,是正确的。
// 不存在的时候,等于0也是可以的
if((map.get(i + '') || 0) != num[i]) return false;

坑点

  • 需要注意:map中的key存储的是字符串类型的,因此再最后使用i遍历的时候,需要将i + '' 转换成字符串进行比较。

AC代码

var digitCount = function(num) {
  let map = new Map();
  num.split('').forEach(val => {
    map.set(val, (map.get(val) || 0) + 1);
  });
  // console.log(map)
  const n = num.length;
  for(let i = 0; i < n; i++) {
    if((map.get(i + '') || 0) != num[i]) return false;
  }
  return true;
};

总结

  • 坑点就是数字和字符串,如果不将i转换为字符串的形式,那么在map中是不能找到对应的结果的。