持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情
每日刷题 2022.05.31
- leetcode原题链接:leetcode.cn/problems/ch…
- 难度:简单
- 方法:map集合
题目
- 给你一个下标从
0开始长度为n的字符串num,它只包含数字。 - 如果对于 每个
0 <= i < n的下标i,都满足数位i在num中出现了num[i]次,那么请你返回true,否则返回false。
示例
- 示例1
输入:num = "1210"
输出:true
解释:
num[0] = '1' 。数字 0 在 num 中出现了一次。
num[1] = '2' 。数字 1 在 num 中出现了两次。
num[2] = '1' 。数字 2 在 num 中出现了一次。
num[3] = '0' 。数字 3 在 num 中出现了零次。
"1210" 满足题目要求条件,所以返回 true 。
- 示例2
输入:num = "030"
输出:false
解释:
num[0] = '0' 。数字 0 应该出现 0 次,但是在 num 中出现了一次。
num[1] = '3' 。数字 1 应该出现 3 次,但是在 num 中出现了零次。
num[2] = '0' 。数字 2 在 num 中出现了 0 次。
下标 0 和 1 都违反了题目要求,所以返回 false 。
提示
n == num.length1 <= n <= 10num只包含数字。
解题思路
- 判断下标
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中是不能找到对应的结果的。