LeetCode 233:数字1的个数 - JavaScript 的清晰规律揭示与示例解析
2023-10-25 18:29:13
前言
数字是编程语言中的基本数据类型,在计算机科学中扮演着举足轻重的角色。数字的表示和操作对于编程人员来说是必备的技能。而LeetCode作为著名的算法练习平台,提供海量优质习题,深受编程爱好者欢迎。LeetCode 233 题要求计算所有小于等于给定整数 n 的非负整数中数字 1 的个数,本篇文章将通过深入剖析该题,带领读者探索数字规律、算法设计和代码实现,揭示隐藏的奥秘。
题意解析
LeetCode 233 题的题意明确且简洁,要求计算所有小于等于给定整数 n 的非负整数中数字 1 的个数。举几个例子,当 n = 13 时,答案是 6,因为在数字 1 到 13 之间,共有 6 个数字包含数字 1,分别是 1、10、11、12、13;当 n = 21 时,答案是 11,因为在数字 1 到 21 之间,共有 11 个数字包含数字 1,分别是 1、10、11、12、13、14、15、16、17、18、19;当 n = 100 时,答案是 21,因为在数字 1 到 100 之间,共有 21 个数字包含数字 1。
规律探索
要解决LeetCode 233 题,需要对数字的规律进行深入的探索。观察题目给出的示例,我们可以发现一些有趣的规律:
- 对于数字 1 到 9,每个数字都包含 1 个数字 1。
- 对于数字 10 到 19,每个数字都包含 2 个数字 1。
- 对于数字 20 到 29,每个数字都包含 3 个数字 1。
- 以此类推,对于数字 (m * 10) 到 (m * 10 + 9),每个数字都包含 m + 1 个数字 1。
算法设计
基于上述规律,我们可以设计一种算法来解决LeetCode 233 题:
- 初始化变量 count 为 0,用于存储数字 1 的个数。
- 从 1 到 n,依次遍历每个数字。
- 将当前数字除以 10,得到商和余数。
- 如果余数等于 1,则将 count 增加 1。
- 将商乘以 10,加上余数,得到新的数字。
- 重复步骤 3 到 5,直到商等于 0。
- 返回 count。
代码实现
/**
* 计算所有小于等于给定整数 n 的非负整数中数字 1 的个数
*
* @param {number} n 给定整数
* @return {number} 数字 1 的个数
*/
const countDigitOne = (n) => {
let count = 0;
for (let i = 1; i <= n; i++) {
let num = i;
while (num > 0) {
const remainder = num % 10;
if (remainder === 1) {
count++;
}
num = Math.floor(num / 10);
}
}
return count;
};
复杂度分析
该算法的时间复杂度为 O(n * log(n)),因为对于每个数字,需要进行 log(n) 次除法运算。
总结
通过本文对LeetCode 233 题的深入剖析,我们探索了数字规律、算法设计和代码实现,揭示了隐藏的奥秘。本篇文章不仅帮助读者解决LeetCode 233 题,更重要的是,它引导读者思考数字的规律,以及如何将这些规律应用于算法的设计和实现中。希望本文对读者有所帮助,也鼓励读者继续探索LeetCode其他习题,在算法学习的道路上不断进步。