整数中1出现的次数(从1到n的整数中1出现的次数)
题目
求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。
思考
方法1:
依次从 1 到 n 遍历,统计每个数中 1 出现的次数,然后累加起来。时间复杂度:遍历 n 个数,每次统计可以在 log(n) 时间内完成,因此 O(nlog(n))。
方法2:
新的角度:给定 N,统计“小于 N 的数在每一位上可能出现 1 的次数” 之和,可得到最终的解。使用函数 f(N) 表示。
1 位数的情况
如果 N=4,则所有可考虑的数为: 1,2,3,4 由此可得 f(N) = 1。不难看出对于所有 1<=N<=9, f(N) = 1,特殊的有 f(0)=0。
2 位数的情况
假设 N=14,可考虑的数为:1,2,3,4,5,6,7,8,9,10,11,12,13,14。
个位上出现 1 的情况:1,11; 2个
十位上出现 1 的情况:10, 11, 12, 13, 14;5个
综合:f(N)=个位数的情况 + 十位数的情况 = 2 + 5 = 7
一般的,
- 个位上 1 的个数统计可以有两种情况:
- 情况 1 : 当前数字 N 个位数是 0,则个位上 1 出现的次数为十位出现的数。(比如 N=10,个位上出现 1 的次数是 1)
- 情况 2 :当前数字 N 个位数大于 0, 则个位上 1 出现的次数为十位出现的数加 1。(比如 N=14,个位上出现 1 的次数是 1+1=2,及 1 和 11)
- 十位上 1 的个数统计:
- 情况 1 : 当十位上的数为 1 时,则十位上出现 1 的次数为:个位上的数加 1 (比如 N=14, 十位上出现 1 的次数 = 4+1=5,及:10,11,12,13,14)
- 情况 2 :当十位上的数大于 1 时,则十位上出现 1 的次数为 10 次。(比如 N=24, 十位上出现 1 的次数 = 10,及:10,11,12,13,14,15,16,17,18,19)
其他两位数字可以类似的方法很快计算出来
3 位数的情况
假设 N = 132
- 个位上出现 1 的次数为 14 次:1,11,21,...,91,101,111,121,131
- 十位上出现 1 的次数为 20 次:10~19, 110~119
- 百位上出现 1 的次数为 33 次:100~132
一般化
同理可以计算 4,5,甚至 k 位数中 1 的个数。
一般的,假设有数 N = ak... a1
我们可以将数字分成 3 个部分,高位部分,当前计算的位置,低位部分;如果计算第 i 位上出现 1 的次数,则高位部分为 ak...ai+1,当前计算位置 ai,低位部分 ai-1...a1。而第 i 位上出现 1 的次数所受影响的来源也将分配到这 3 个部分当中。
在来一个例子,假设 N = 13014
- 个位出现 1 的次数,ihight=1301, icur = 4,因此 icur > 1,所以 1 的次数为 ihight+1 = 1302
- 十位出现 1 的次数,ihight=130, icur=1, ilow=4,因此 1 的次数为 ihight*10+ilow+1=130*10+4+1=1305
- 百位出现 1 的次数,ihight=13, icur=0, ilow=14
- icur = 0,影响只来源于高位部分,13 个 100,每个100在百位上将会出现100个1,也就是 13*100=1300
- icur = 1,假设 N=13114,影响来源于高位和低位:
- 高位部分,ihight=13, 13 个 100,则 1 的个数为 13 * 100 = 1300
- 低位部分,ilow=14,13100~13114,1 的个数为 ilow+1 = 14+1 = 15
- icur > 1,假设 N=13214,影响仅来源于高位:
- ihight = 13,13 个 100,当前尾部 13100~13199 有一个100,总攻是 14 个,及 ihight+1 个 100,1 的个数为 (13+1)*100 = 1400
由此规律很容易实现代码。
思考总线,从简单的例子入手找规律,抽象出一般化的规律,要注意细节
code
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class Solution{
public:
int NumberOf1Between1AndN_Solution(int n){
int icout = 0;
int ihight = 0;
int ilow = 0;
int icur = 0;
int ifactor = 1;
while( n / ifactor != 0){
ihight = n / (ifactor*10);
icur = (n / ifactor) % 10;
ilow = n - (n / ifactor) * ifactor;
switch(icur){
case 0 :
icout += ihight*ifactor;
break;
case 1 :
icout += ihight*ifactor + ilow + 1;
break;
default:
// icur > 1
icout += (ihight+1)*ifactor;
}
ifactor *= 10; // scan from the low-order to high-order
}
return icout;
}
};
int main()
{
return 0;
}
整数中1出现的次数(从1到n的整数中1出现的次数)的更多相关文章
- 题目1373:整数中1出现的次数(从1到n整数中1出现的次数)
题目1373:整数中1出现的次数(从1到n整数中1出现的次数) 题目描述: 亲们!!我们的外国友人YZ这几天总是睡不好,初中奥数里有一个题目一直困扰着他,特此他向JOBDU发来求助信,希望亲们能帮帮他 ...
- 输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数
题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数.例如输入12,从1到12这些整数中包含1 的数字有1,10,11和12,1一共出现了5次. 分析:首先最先想到的是遍历从1到n的每 ...
- 算法: 整数中1出现的次数(从1到n整数中1出现的次数)
问题: 整数中1出现的次数(从1到n整数中1出现的次数) 问题:求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数? 为此他特别数了一下1~13中包含1的数字有1.10.11 ...
- 《剑指offer》— JavaScript(31)整数中1出现的次数(从1到n整数中1出现的次数)
整数中1出现的次数(从1到n整数中1出现的次数) 题目描述 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12 ...
- 剑指Offer - 九度1373 - 整数中1出现的次数(从1到n整数中1出现的次数)
剑指Offer - 九度1373 - 整数中1出现的次数(从1到n整数中1出现的次数)2014-02-05 23:03 题目描述: 亲们!!我们的外国友人YZ这几天总是睡不好,初中奥数里有一个题目一直 ...
- 剑指offer-31:整数中1出现的次数(从1到n整数中1出现的次数)
参考: https://troywu0.gitbooks.io/interview/整数中出现1的次数(从1到n整数中1出现的次数).html 题目描述 求出1~13的整数中1出现的次数,并算出100 ...
- 剑指Offer(三十一):整数中1出现的次数(从1到n整数中1出现的次数)
剑指Offer(三十一):整数中1出现的次数(从1到n整数中1出现的次数) 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https:// ...
- 请输入一个大于7的整数,输出小于k并且至少满足下面2个条件中的1个条件的所有正整数
import java.util.Scanner; /** * @author:(LiberHome) * @date:Created in 2019/3/6 22:06 * @description ...
- 刷题之给定一个整数数组 nums 和一个目标值 taget,请你在该数组中找出和为目标值的那 两个 整数
今天下午,看了一会github,想刷个题呢,就翻出来了刷点题提高自己的实际中的解决问题的能力,在面试的过程中,我们发现,其实很多时候,面试官 给我们的题,其实也是有一定的随机性的,所以我们要多刷更多的 ...
- JavaScript中一些你不一定知道的问题(持续更新中。。。。)
一些js的问题与解析 1) ["1","2","3"].map(parseInt);的运行结果是? A.["1",&qu ...
随机推荐
- [SDOI2009]晨跑
又是一道山东省选的题目,居然题目又十分水100行的代码就随随便便AC了. Description Elaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧撑.仰卧起坐等 等,不过到目前为止 ...
- java数据库编程之事务、视图、索引、备份、恢复
第五章:事务.视图.索引.备份和恢复 5.1:事务 事务的概念:事务(transcation)是讲一系列数据操作捆绑成为一个整体进行统计管理. 如果某一事务执行成功了,则该事务进行操作的所有数据将会提 ...
- hadoop(二)搭建伪分布式集群
前言 前面只是大概介绍了一下Hadoop,现在就开始搭建集群了.我们下尝试一下搭建一个最简单的集群.之后为什么要这样搭建会慢慢的分享,先要看一下效果吧! 一.Hadoop的三种运行模式(启动模式) 1 ...
- MySQL 高效查询
在“现场加号&预约排队”项目中,“号贩子排查任务”在线下测试的时候没有问题,但是线上后,由于线上的数据量较大,导致在执行查询的时系统崩溃:后来经过查找,发现写的sql不合理,查出了许多用不到的 ...
- thrift例子:python客户端/java服务端
java服务端的代码请看上文. 1.说明: 这两篇文章其实解决的问题是,当使用python去访问大数据线上集群的时候,遇到两个问题: 1)python-hadoop和python-hive相关包链接不 ...
- spring两大核心对象IOC和AOP(新手理解)
现在自己对spring的理解是:spring的主要的作用是用来进行业务的处理和实现类与类之间的解耦. 其中实现解耦功能 是IOC(控制反转)通过sessionfactory工厂来为需要的对象注入对应的 ...
- iOS 简单socket连接
- (void)CreateSocket{ NSString *host = [self.realStreamDict objectForKey:@"StreamSeverIP"] ...
- win10 uwp Window.Current.Dispatcher中Current为null
本文说的是进行网络中异步界面出现的错误,可能带有一定的主观性和局限性,说的东西可能不对或者不符合每个人的预期.如果觉得我有讲的不对的,就多多包含,或者直接关掉这篇文章,但是请勿生气或者发怒吐槽,可以在 ...
- RT-thread 利用Scons 工具编译提示python编码错误解决办法
错误信息: scons: Reading SConscript files ...UnicodeDecodeError: 'ascii' codec can't decode byte 0xbd in ...
- 恶意软件Mirai换了个马甲 瞄上我国2亿多台IoT设备
恶意软件Mirai换了个马甲 瞄上我国2亿多台IoT设备 想要起来时,一种沉重感阻碍着他,这是一种安全感:感觉到一张床为他铺好了,而且只属于他:想要静卧时,一种不安阻碍着他,把他从床上赶起来,这是 ...