《剑指offer》-整数中1出现的次数
题目描述
求出113的整数中1出现的次数,并算出1001300的整数中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]
《剑指offer》-整数中1出现的次数的更多相关文章
- 剑指Offer 整数中1出现的次数(从1到n整数中1出现的次数)
题目描述 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了. ...
- 剑指Offer——整数中1出现的次数(从1到n整数中1出现的次数)
题目描述: 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了 ...
- 剑指offer 整数中1 出现的次数
给定一个十进制正整数N,写下从1开始,到N的所有整数,然后数一下其中出现的所有"1"的个数. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1 ...
- 剑指offer--36.整数中1出现的次数(从1到n整数中1出现的次数)
暴力挨个数 ---------------------------------------------------------------------- 时间限制:1秒 空间限制:32768K 热度指 ...
- 剑指Offer-31.整数中1出现的次数(从1到n整数中1出现的次数)(C++/Java)
题目: 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了.A ...
- 剑指offer32 整数中1出现的次数(从1到n整数中1出现的次数)
class Solution { public: int NumberOf1Between1AndN_Solution(int n) { ) ; ; ; while(i<=n) { int p= ...
- 剑指 Offer —— 数组中重复的数字
数组中的重复数字 题目描述 牛课网链接 长度为 n 的数组里,所有数字都在 0 到 n-1 的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一 ...
- 剑指offer 数组中重复的数
在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为7的数组{ ...
- 剑指offer-整数中1出现的次数
题目描述 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了. ...
- 剑指offer-整数中1出现的次数27
题目描述 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了. ...
随机推荐
- mysql优化问题汇总
sql优化-->分区-->分表-->垂直分库-->水平分库-->读写分离 分区 关于分区的博客推荐这个:https://blog.csdn.net/youzhouliu/ ...
- java通过当前请求得到访问者ip的工具类
在我们开发的过程中,也许有下面的这样的需求,就是要记录一下每次访问服务器的ip,需要存到数据库,以便以后进行数据分析等... 下面给大家介绍一个通过当前请求得到访问者ip的工具类 IpUtil.jav ...
- Linux记录-AWK语法(转载)
1.原理 awk,一个行文本处理工具,逐行处理文件中的数据 语法:awk 'pattern + {action}' 说明:(1)单引号''是为了和shell命令区分开:(2)大括号{}表示一个命令分组 ...
- Study 6 —— 字体和段落属性
字体风格{font-style:normal | italic | oblique | inherit字体复合属性{font:font-style font-variant font-weight f ...
- 关于js事件执行顺序小技巧
js事件执行顺序是js中一个老生常谈的一个话题, 聊这个话题之前我们先谈谈怎么给页面元素绑定我们需要的事件 1.给页面元素绑定事件 a)直接在元素上面加上需要绑定的事件,如 <button ty ...
- POJ - 1850 Code(组合数学)
https://vjudge.net/problem/POJ-1850 题意 输出某字符串在字典中的位置.字符串不合规则时输出0. 分析 首先判断字符串合法性,也就是判断是不是升序排列的.如果符合,以 ...
- Java编程思想 学习笔记1
一.对象导论 1.抽象过程 Alan Kay曾经总结了第一个成功的面向对象语言.同时也是Java所基于的语言之一的Smalltalk的五个基本特性,这些特性表现了纯粹的面向对象程序设计方式 1)万物皆 ...
- 20155237 2016-2017-2 《Java程序设计》第8周学习总结
20155237 2016-2017-2 <Java程序设计>第8周学习总结 教材学习内容总结 NIO与NIO2 认识NIO Channel: 衔接数据节点(与IO中的流对比) isOpe ...
- POJ 1811 Prime Test (Rabin-Miller强伪素数测试 和Pollard-rho 因数分解)
题目链接 Description Given a big integer number, you are required to find out whether it's a prime numbe ...
- mysql 案例 ~ pt校验工具介绍
简介:今天咱们来聊聊PT校验工具pt-table-checksum 注意事项: 1. 根据测试,需要一个即能登录主库,也能登录从库的账号: 2. 只能指定一个host,必须为主库的IP: ...