博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《剑指offer》-整数中1出现的次数
阅读量:5775 次
发布时间:2019-06-18

本文共 1266 字,大约阅读时间需要 4 分钟。

题目描述

求出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;    }};

参考:[).html]

转载地址:http://oghux.baihongyu.com/

你可能感兴趣的文章
Centos7.x:开机启动服务的配置和管理
查看>>
HTML5 浏览器返回按钮/手机返回按钮事件监听
查看>>
xss
查看>>
iOS:百度长语音识别具体的封装:识别、播放、进度刷新
查看>>
JS获取服务器时间并且计算距离当前指定时间差的函数
查看>>
java中关于重载与重写的区别
查看>>
最受欢迎的14款渗透测试工具
查看>>
华为硬件工程师笔试题
查看>>
jquery居中窗口-页面加载直接居中
查看>>
cd及目录快速切换
查看>>
黑马day11 不可反复度&解决方式
查看>>
分布式服务化系统一致性的“最佳实干”--转
查看>>
一次Mutex死锁的原因探究
查看>>
flask的文件上传和下载
查看>>
如何查看java class文件的jdk版本
查看>>
ImportError: cannot import name UnrewindableBodyError
查看>>
翻翻git之---有用的欢迎页开源库 AppIntro
查看>>
Unity Shaders and Effects Cookbook (3-5) 金属软高光
查看>>
31-hadoop-hbase-mapreduce操作hbase
查看>>
C++ 代码风格准则:POD
查看>>