Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >整数中1出现的次数(从1到n整数中1出现的次数)_31

整数中1出现的次数(从1到n整数中1出现的次数)_31

作者头像
名字是乱打的
发布于 2021-12-23 10:22:40
发布于 2021-12-23 10:22:40
1K00
代码可运行
举报
文章被收录于专栏:软件工程软件工程
运行总次数:0
代码可运行

image.png

两种方法。
1.总结规律

思路:

  • 1.对于整数n,我们将这个整数分为三部分:当前位数字cur,更高位数字high,更低位数字low,如:对于n=21034,当位数是十位时,cur=3,high=210,low=4。
    1. 我们从个位到最高位 依次计算每个位置出现1的次数
    • 1当前位的数字等于0时,例如n=21034,在百位上的数字cur=0,百位上是1的情况有:00100~0019901100~01199,……,20100~20199。一共有21*100种情况,即high*100;
    • 2)当前位的数字等于1时,例如n=21034,在千位上的数字cur=1,千位上是1的情况有:01000~0199911000~1199921000~21034。一共有2*1000+(34+1)种情况,即high*1000+(low+1)。
    • 3)当前位的数字大于1时,例如n=21034,在十位上的数字cur=3,十位上是1的情况有:00010~00019,00110~00119,……,21010~21019。一共有(210+1)*10种情况,即(high+1)*10。
    • 4)这个方法只需要遍历每个位数,对于整数n,其位数一共有lgn个,所以时间复杂度为O(logn)。

代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 public int NumberOf1Between1AndN_Solution(int n) {
        int count=0;
        for (int i = 1; i <=n; i*=10) {
            //更高位的((数字
            int high=n/i*10;
            //更低位数字
            int low=n%i;
            //当前位数字
            int curr=n/i%10;
            if (curr==0){
                count+=high*10;
            }else if (curr==1){
               count+=high*i+(low+1);
            }else {
               count+=(high+1)*i;
            }
        }
        return count;
    }
方法二:

注解:参考一位牛友提到的leetcode的链接网址(包括求1~n的所有整数中2,3,4,5,6,7,8,9出现的所有次数) 通过使用一个 位置乘子m 遍历数字的位置, m 分别为1,10,100,1000…etc.(m<=n)

对于每个位置来说,把10进制数分成两个部分,比如说 当m=100的时候, 把十进制数 n=3141592 分成 a=31415 和 b=92 ,以此来分析百位数为1时所有数的个数和。m=100时,百位数的前缀为3141,当百位数大于1时,为3142*100,因为当百位数大于1时,前缀可以为0,即百位数可以从100到199,共100个数;当百位数不大于1时,为3141*100;如何判断百位数是否大于1?假设百位数为x,若(x+8)/10等于1,则大于1,若(x+8)/10等于0,则小于1。因此前缀可用(n/m + 8)/10 *m来计算(若计算2的个数,可以改为(n/m + 7)/10*m,若计算3的个数,改为(n/m + 6)/10*m,…以此类推)。

再例如m=1000时,n分为a=3141和 b=592;千位数的前缀为314,千位数不大于1,故前缀计算为314*1000;因为千位数为1,再加b+1(0到592)。即千位数为1的所有书的个数和为314*1000+592+1;公式(n/m + 8)/10*m + b +1。

注意:只有n的第m位为1时需要计算后缀,后缀计算为 (n/m%10==1)*(b+1),另外a+8的巧妙之处在于当a的最后一位(当前分析位)为0或1时,加8不产生进位,这是为需要单独算的特殊情况做准备,而当前分析位为2~9时,不需要考虑特殊情况,所以允许加8产生的进位。

即(n/m%10==1)判断第m位是否为1,若为1,则加上(b+1),若不为1,则只计算前缀。(若计算2的个数,可以改为(n/m%10==2)*(b+1),若计算3的个数,可以改为(n/m%10==3)*(b+1)…以此类推)

代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public int NumberOf1Between1AndN_Solution(int n) {
        int count = 0;

        //m为个位, 十位 百位 千位....
        for (long m = 1; m <= n; m *= 10) {
            //n除以基数后的数
            long a = n / m;
            //n在基础上的数
            long b = n % m;
            //a%10表示上一位是否为1,为0?后一位为几就加几:0
            count+=(a+8)/10*m+(a%10==1?b+1:0);
        }
        return count;
    }
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/4/24 下,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
[剑指offer] 整数中1出现的次数(从1到n整数中1出现的次数)
求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。
尾尾部落
2018/09/04
1.1K0
剑指offer 43——1~n整数中1出现的次数
例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。
健程之道
2020/06/16
3470
python-剑指offer21-40
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
西西嘛呦
2020/08/26
5300
【算法专栏】整数中1出现的次数
求出 1~13的整数中1出现的次数,并算出 100~1300的整数中1出现的次数?为此他特别数了一下 1~13中包含1的数字有 1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。
ConardLi
2019/05/23
5970
剑指Offer(三十一)-- 整数中1出现的次数
求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。
秦怀杂货店
2022/02/15
3560
【leetcode】43.1~n整数中1出现的次数
例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。
海盗船长
2020/08/27
1K0
【剑指Offer】43. 从 1 到 n 整数中 1 出现的次数
思路是分别计算个位、十位、百位…上出现 1 的个数。 以 n =216为例: 个位上: 1 ,11,21,31,…211。个位上共出现(216/10)+ 1个 1 。因为除法取整,210~216间个位上的1取不到,所以我们加8进位。你可能说为什么不加9,n=211怎么办,这里把最后取到的个位数为1的单独考虑,先往下看。 十位上:1019,110119,210~216. 十位上可看成 求(216/10)=21 个位上的1的个数然后乘10。这里再次把最后取到的十位数为1的单独拿出来,即210~216要单独考虑 ,个数为(216%10)+1 .这里加8就避免了判断的过程。 后面以此类推。 时间复杂度 O(logN)
瑞新
2020/12/07
5560
【剑指Offer】43. 从 1 到 n 整数中 1 出现的次数
整数中1出现的次数
题目 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数? 为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。 ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。
名字是乱打的
2022/05/13
7230
[剑指offer题解][Java]1到n整数中1出现的次数
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
蛮三刀酱
2019/09/10
7140
[剑指offer题解][Java]1到n整数中1出现的次数
求出1 ~ 13的整数中1出现的次数,并算出100 ~ 1300的整数中1出现的次数?为此他特别数了一下1 ~ 13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。
Rude3Knife的公众号
2019/08/06
7350
牛客网-剑指offer-10
主要是想为什么会有最大的和,一个情况是,新加上的数比原来的数都要大,就要开始考虑需不需要原来的数了。所以我们需要两个数,一个保存最大的和,用来返回,一个 保存当前的和,可以在适当的时候丢掉。 另一种情况,加入的数都比原来的小,即都是负数的时候,可能最大和只是一个最小的数;另外,当都是正数的时候也比较好解决。 代码如下:
小二三不乌
2018/08/07
4780
C++版 - 剑指offer 面试题32:从1到n整数中1出现的次数(leecode233. Number of Digit One) 题解
剑指offer 面试题32:从1到n整数中1出现的次数(Leecode233. Number of Digit One)
Enjoy233
2019/03/05
6300
每天一道剑指offer-整数中1出现的次数
求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。
乔戈里
2019/03/06
8060
《剑指offer》– 数组中的逆序对、最小的K个数、从1到n整数中1出现的次数、正则表达式匹配、数值的整数次方
数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007。
全栈程序员站长
2021/12/23
9450
《剑指offer》– 数组中的逆序对、最小的K个数、从1到n整数中1出现的次数、正则表达式匹配、数值的整数次方
剑指offer | 面试题34:1~n 整数中 1 出现的次数
例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。
千羽
2021/12/29
2770
剑指offer | 面试题34:1~n 整数中 1 出现的次数
PAT 1049 Counting Ones (30分) 编程之美--1的个数
The task is simple: given any positive integer N, you are supposed to count the total number of 1's in the decimal form of the integers from 1 to N. For example, given N being 12, there are five 1's in 1, 10, 11, and 12.
vivi
2020/07/14
6170
PAT 1049 Counting Ones (30分) 编程之美--1的个数
算法题目(三)
第一步在树A中查找与根结点的值一样的结点,这实际上就是树的遍历。递归调用HasSubTree遍历二叉树A。如果发现某一结点的值和树B的头结点的值相同,则调用DoesTreeHavaTree2,做第二步判断。
Helloted
2022/06/06
3010
【剑指offer】31.整数中1出现的次数
求出1 ~ 13的整数中1出现的次数,并算出100 ~ 1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。
AI那点小事
2020/07/21
3560
Sword To Offer 031 - 整数中1出现的次数(从1到n整数中1出现的次数)
求出113的整数中1出现的次数,并算出1001300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。
Reck Zhang
2021/08/11
5280
剑指offer No.31 整数中1出现的次数
求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。
week
2020/04/22
2710
推荐阅读
相关推荐
[剑指offer] 整数中1出现的次数(从1到n整数中1出现的次数)
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验