返回

javascript 巧妙解决“1~n整数中1出现的次数”难题

前端

// javascript题解
// 剑指offer专栏


function NumberOf1Between1AndN_Solution(n)
{
    // write code here
    let res = 0
    for(let i = 1; i<=n; i++)
    {
        let num = i
        while(num>0)
        {
            if(num%10 === 1) res++
            num = parseInt(num/10)
        }
    }
    return res
}

剑指Offer专栏:巧妙解决“1~n整数中1出现的次数”难题(javascript实现)

题目

给定一个整数n,求从1到n的整数中1出现的次数。例如,给定n=13,从1到13的整数中1出现的次数为6,分别出现在1、10、11、12、13中。

解题思路:

这道题目的关键在于找规律。我们可以将数字按照其位数进行分类,分别讨论每种情况下的规律。

  • cur>1:

当数字cur大于1时,cur中包含的1的个数等于cur中包含的1的个数乘以cur的位数。例如,123中包含的1的个数等于12中包含的1的个数乘以3。

  • cur=1:

当数字cur等于1时,cur中包含的1的个数等于cur本身。例如,1中包含的1的个数等于1。

  • cur<1:

当数字cur小于1时,cur中不包含1。例如,0中不包含1。

解题代码:

function NumberOf1Between1AndN_Solution(n) {
  let res = 0;
  for (let i = 1; i <= n; i++) {
    let num = i;
    while (num > 0) {
      if (num % 10 === 1) res++;
      num = parseInt(num / 10);
    }
  }
  return res;
}

精讲UP主:

https://www.bilibili.com/video/BV18E411r7xu?spm_id_from=333.999.0.0

结语:

这道题目的解法看似简单,但其实蕴含着许多数学规律。通过对数字进行分类并分析每种情况下的规律,我们可以得到一个高效的解决方案。希望本文对您的学习有所帮助!