Skip to content

Latest commit

 

History

History
153 lines (123 loc) · 4.65 KB

2283.md

File metadata and controls

153 lines (123 loc) · 4.65 KB
title description keywords
2283. 判断一个数的数字计数是否等于数位的值
LeetCode 2283. 判断一个数的数字计数是否等于数位的值题解,Check if Number Has Equal Digit Count and Digit Value,包含解题思路、复杂度分析以及完整的 JavaScript 代码实现。
LeetCode
2283. 判断一个数的数字计数是否等于数位的值
判断一个数的数字计数是否等于数位的值
Check if Number Has Equal Digit Count and Digit Value
解题思路
哈希表
字符串
计数

2283. 判断一个数的数字计数是否等于数位的值

🟢 Easy  🔖  哈希表 字符串 计数  🔗 力扣 LeetCode

题目

You are given a 0-indexed string num of length n consisting of digits.

Return true _if for every index _i in the range 0 <= i < n , the digiti occursnum[i]times innum , otherwise returnfalse.

Example 1:

Input: num = "1210"

Output: true

Explanation:

num[0] = '1'. The digit 0 occurs once in num.

num[1] = '2'. The digit 1 occurs twice in num.

num[2] = '1'. The digit 2 occurs once in num.

num[3] = '0'. The digit 3 occurs zero times in num.

The condition holds true for every index in "1210", so return true.

Example 2:

Input: num = "030"

Output: false

Explanation:

num[0] = '0'. The digit 0 should occur zero times, but actually occurs twice in num.

num[1] = '3'. The digit 1 should occur three times, but actually occurs zero times in num.

num[2] = '0'. The digit 2 occurs zero times in num.

The indices 0 and 1 both violate the condition, so return false.

Constraints:

  • n == num.length
  • 1 <= n <= 10
  • num consists of digits.

题目大意

给你一个下标从 0 开始长度为 n 的字符串 num ,它只包含数字。

如果对于 每个 0 <= i < n 的下标 i ,都满足数位 inum 中出现了 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.length
  • 1 <= n <= 10
  • num 只包含数字。

解题思路

  1. 统计频率

    • 使用一个长度为 10 的数组 freq(因为数字范围是 0-9),记录每个数字在字符串中的出现次数。
    • 遍历字符串,逐一更新 freq 中对应索引的位置。
  2. 验证条件

    • 遍历字符串的每个字符,根据索引 i 和字符串值 num[i] 进行验证:
      • 如果 freq[i] 不等于 num[i] 的数值形式,返回 false
    • 如果所有索引都满足条件,返回 true

复杂度分析

  • 时间复杂度O(n),其中 n 是字符串长度。需要两次遍历,第一次遍历字符串统计频率,第二次遍历字符串验证每个字符是否符合条件。
  • 空间复杂度O(1),频率数组 freq 长度为常数 10。

代码

/**
 * @param {string} num
 * @return {boolean}
 */
var digitCount = function (num) {
	let freq = new Array(10).fill(0); // 初始化频率数组
	for (let char of num) {
		freq[Number(char)]++; // 统计每个数字的频率
	}
	for (let i = 0; i < num.length; i++) {
		if (freq[i] !== Number(num[i])) return false; // 验证频率是否符合要求
	}
	return true; // 所有条件均满足
};

相关题目

题号 标题 题解 标签 难度 力扣
728 自除数 [✓] 数学 🟢 🀄️ 🔗