返回

LeetCode 233:数字1的个数 - JavaScript 的清晰规律揭示与示例解析

前端

前言

数字是编程语言中的基本数据类型,在计算机科学中扮演着举足轻重的角色。数字的表示和操作对于编程人员来说是必备的技能。而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 题:

  1. 初始化变量 count 为 0,用于存储数字 1 的个数。
  2. 从 1 到 n,依次遍历每个数字。
  3. 将当前数字除以 10,得到商和余数。
  4. 如果余数等于 1,则将 count 增加 1。
  5. 将商乘以 10,加上余数,得到新的数字。
  6. 重复步骤 3 到 5,直到商等于 0。
  7. 返回 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其他习题,在算法学习的道路上不断进步。