《剑指offer》-整数中1出现的次数

简介: 题目描述求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。

题目描述
求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。

直接暴力可以过。但是不优美。
尝试推导公式,思路是递归求解,发现假如n都是999,99999这种全9的数字会很好处理:f(n)=g(t)*f(h(n)), 其中t表示n的第一个位,h(n)表示n去掉第一位,g(t)要特别考虑1的情况。

但是n很可能连一个9都没有。没关系,那就把n切分成两部分,一部分是能用99999这种处理的,另一部分是再单独计算的。

而其实这两个部分是可以合并的,99999的情况是后者的特例而已。

利用数字特点和规律,计算每一位上1出现的次数:
例如百位上1出现次数,数值n在百位上的值是curNum则:

if(curNum==0)
1出现的次数等于比百位更高位数100。例如n=1023,高位数就是1,百位上出现1的次数是1100;

if(curNum==1)
1出现的次数等于比百位更高位数100,再加上低位上的数,再加1。例如n=1123,高位数就是1,低位数是23,百位上出现1的次数是1100+23+1;

if(curNum>1)
1出现的次数等于比百位更(高位数+1)100,例如n=1223,高位数就是1,次数百位上出现1的次数是(1+1)100;

而其实这种策略是适用于各个位的,不仅仅是在百位上。那么直接上码吧:

class Solution {
public:
    int NumberOf1Between1AndN_Solution(int n)
    {
        int count=0;
        int factor=1;
        while(n/factor!=0){
            int curNum = (n/factor)%10;
            int lowNum = n%factor;
            int highNum = n/(factor*10);
            
            if(curNum==0){
                count += factor*highNum;
            }
            else if(curNum==1){
                count += factor*highNum + lowNum + 1;
            }
            else{
                count += factor*(highNum + 1);
            }
            factor *= 10;
        }
        return count;
    }
};

参考:[https://troywu0.gitbooks.io/interview/content/整数中出现1的次数(从1到n整数中1出现的次数).html]

目录
相关文章
|
C#
阿里云域名价格注册、续费及转入费用(com、cn多域名后缀报价)
阿里云com域名注册价格69元,企业新用户注册com域名优惠价1元;cn域名注册价格29元,新用户注册cn域名8.8元;阿里云com域名续费79元一年,使用优惠口令续费68元一年;阿里云cn域名续费价格39元,使用优惠口令后价格35元一年。
5369 1
阿里云域名价格注册、续费及转入费用(com、cn多域名后缀报价)
|
网络协议 网络安全
FRP内网穿透
参考github文档 frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp, http, https 协议。 frp 的作用 利用处于内网或防火墙后的机器,对外网环境提供 http 或 https 服务。
9538 0
|
1天前
|
云安全 人工智能 自然语言处理
|
6天前
|
搜索推荐 编译器 Linux
一个可用于企业开发及通用跨平台的Makefile文件
一款适用于企业级开发的通用跨平台Makefile,支持C/C++混合编译、多目标输出(可执行文件、静态/动态库)、Release/Debug版本管理。配置简洁,仅需修改带`MF_CONFIGURE_`前缀的变量,支持脚本化配置与子Makefile管理,具备完善日志、错误提示和跨平台兼容性,附详细文档与示例,便于学习与集成。
314 116
|
8天前
|
数据采集 人工智能 自然语言处理
Meta SAM3开源:让图像分割,听懂你的话
Meta发布并开源SAM 3,首个支持文本或视觉提示的统一图像视频分割模型,可精准分割“红色条纹伞”等开放词汇概念,覆盖400万独特概念,性能达人类水平75%–80%,推动视觉分割新突破。
610 53
Meta SAM3开源:让图像分割,听懂你的话
|
21天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~