剑指offer31:整数中1出现的次数(从1到n整数中1出现的次数)
1 题目描述
2 思路和方法
统计整数n中的每个十进制位中1出现的次数,再累加起来。 对于每一位来说可以把一个数拆分为 前面( begin)+中间( middle)+后面(end )。 1234的百位 = 1+2+34
(编程之美)找数字规律,五行代码:
首先要知道以下规律:
从 1 至 10,在它们的个位数中,1出现了 1 次;
从 1 至 100,在它们的十位数中,1出现了 10 次;
从1至1000,在它们的百位数中,1出现了100次;
依次类推,从 1 至 10 i,在它们的左数第二位(右数第 i 位),1出现了 (10 i-1)次。这个规律很容易验证。
我们以n=21345为例来使用这个规律。首先分析个位1出现了几次。从1~21340数字1总共出现了2134*1次,最后剩下21341、21342、21343、21344、21345,所有还出现1次数字1。所以个位共出现1的次数为2135次。
接下来分析十位中1出现了几次。从1~21300数字1总共出现了213*10次,剩下的数字从 21301至 21345,它们最大的十位数是 4 > 1,所以还有10次。所以十位共出现2140次。
接下来分析百位中1出现了几次。从1至21000数字1共出现了21*100次。剩下的数字是21001~21345,最大的百位数是3,大于1,所以还有100次。所以百位中1共出现了2200次。
接下来分析千位中1出现了几次。从120000数字1共出现了2*1000次。剩下的数字是2000121345,最大的千位数是1,等于1,这种情况稍微比较复杂,因为它并不包括所有千位为1的数字,即1000个,这种情况取决于低位上的数字,为345+1=346次。最后总计2346次。
接下来分析万位中1出现了几次。因为它是最高位了因此直接看最高位的数字,即2,2>1。很显然10000~19999中1在万位共出现了10000次。如果最高位等于1那就和上一步的思想一样。
通过以上几步的分析我们可以得出结果:1~21345中1共出现了18821次。
3 C++核心代码
简洁版:https://blog.csdn.net/typantk/article/details/88386888(讲解的太好了)
class Solution {
public:
int NumberOf1Between1AndN_Solution(int n)
{
int ones = ;
for (long m = ; m <= n; m *= )
ones += (n/m + ) / * m + (n/m % == ? n%m + : );
return ones;
}
};
代码较多
class Solution {
public:
int NumberOf1Between1AndN_Solution(int n)
{
int temp = n;
int last;
int result = ;
int base = ;
while(temp){
last = temp%; //个位数是否为1
temp = temp/; //去掉个位数
result += temp*base;
if (last==){
result += n%base + ;
}
else if(last>){
result += base;
}
base *= ;
}
return result;
}
};
4. C++完整代码
#include <iostream> using namespace std; long long fun(long long n)
{
if (n < )
return ;
long long count = , num = , begin, middle, end, m;
begin = n;
middle = ;
end = ;
while (begin)
{
begin = n / count;
m = n%count;
middle = m / (count / );
end = m % (count / );
if (middle > )
num = num + (count / ) * (begin + );
else if (middle == )
num = num + (count / ) * begin + (end + );
else
num = num + (count / ) * begin;
count = count * ;
}
return num;
} int main()
{
long long n, m;
while (scanf("%lld %lld", &n, &m) != EOF)
{
if (n>m)
printf("%lld\n", fun(n) - fun(m - ));
else
printf("%lld\n", fun(m) - fun(n - ));
}
printf("%\n"); system("pause");
return ;
}
https://blog.csdn.net/zhoubin1992/article/details/47361969
参考资料
https://blog.csdn.net/typantk/article/details/88386888(讲解的太好了)
https://blog.csdn.net/u012477435/article/details/83351659#_873
https://blog.csdn.net/qq_25343557/article/details/79330274(讲解的太好了)
剑指offer31:整数中1出现的次数(从1到n整数中1出现的次数)的更多相关文章
- 剑指offer-31:整数中1出现的次数(从1到n整数中1出现的次数)
参考: https://troywu0.gitbooks.io/interview/整数中出现1的次数(从1到n整数中1出现的次数).html 题目描述 求出1~13的整数中1出现的次数,并算出100 ...
- 剑指Offer-31.整数中1出现的次数(从1到n整数中1出现的次数)(C++/Java)
题目: 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了.A ...
- 《剑指offer》第四十三题(从1到n整数中1出现的次数)
// 面试题43:从1到n整数中1出现的次数 // 题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数.例如 // 输入12,从1到12这些整数中包含1 的数字有1,10,11和12 ...
- 【剑指Offer面试编程题】题目1349:数字在排序数组中出现的次数--九度OJ
题目描述: 统计一个数字在排序数组中出现的次数. 输入: 每个测试案例包括两行: 第一行有1个整数n,表示数组的大小.1<=n <= 10^6. 第二行有n个整数,表示数组元素,每个元素均 ...
- 剑指 Offer 30. 包含min函数的栈 + 双栈实现求解栈中的最小值
剑指 Offer 30. 包含min函数的栈 Offer_30 题目描述: 题解分析: 题目其实考察的是栈的知识,本题的目的是使用两个栈来求解最小值. 第二个栈主要用来维护第一个栈中的最小值,所以它里 ...
- 剑指offer--31.二叉树中和为某一值的路径
深度优先搜索 --------------------------------------------------------------------------------------------- ...
- 剑指offer——python【第49题】把字符串转换成整数
题目描述 将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),要求不能使用字符串转换整数的库函数. 数值为0或者字符串不是一 ...
- 《剑指offer》第六十七题(把字符串转换成整数)
// 面试题67:把字符串转换成整数 // 题目:请你写一个函数StrToInt,实现把字符串转换成整数这个功能.当然,不 // 能使用atoi或者其他类似的库函数. #include <ios ...
- 剑指Offer的学习笔记(C#篇)-- 数字在排序数组中出现的次数
题目描述 统计一个数字在排序数组中出现的次数. 一 . 题目分析 该题目并不是难题,但该题目考察目的是正确的选择合适的查找方法.题目中有一个关键词是:排序数组,也就是说,该数组已经排好了,我一开始直接 ...
随机推荐
- locust使用命令
locust -f locust_demo.py --logfile=locusfile.log
- css设置使文字显示2行多余的为省略号...
1 2 3 4 5 6 7 8 9 10 11 12 .title{ font-size: .7rem; line-height: 1.5rem; ove ...
- 三大框架 之 Hibernate生成策略与缓存策略(主键生成策略、持久化、持久化类划分、一级缓存、事物管理)
目录 Hibernate生成策略与缓存策略 主键生成策略 主键分类 主键的生成策略 持久化 什么是持久化 什么是持久化类 持久化类编写规则 持久化类的划分 三种状态区分 持久态对象特征 一级缓存 什么 ...
- T-MAX-冲刺总结
T-MAX-冲刺总结 这个作业属于哪个课程 班级链接 这个作业要求在哪里 作业要求的链接 团队名称 T-MAX 这个作业的目标 冲刺总结 作业的正文 T-MAX-冲刺总结 其他参考文献 面向B站,百度 ...
- CESIUM内置shader变量和函数[转]
cesium中内置了一些常量.变量和函数,在vs和fs中可直接使用. 内置uniform 内置uniform主要置于AutomaticUniforms类里面,该类私有未开放文档. czm_backgr ...
- vue-使用keepAlive对上下拉刷新列表数据 和 滚动位置细节进行处理
[前言] 使用vue处理项目中遇到列表页面时,有一些细节需要注意,这里总结一下,以便优化以后的代码.如下: 1. 使用mint-ui中的LoadMore组件上下拉刷新时,有时无法触发上拉加载更多的方法 ...
- Visual Studio 2019更新到16.2.2
Visual Studio 2019更新到16.2.2 此次更新的变化有以下几点: (1)修复了Visual Studio在关闭时的停止响应问题.(2)修复CVE-2019-1211权限提升漏洞.(3 ...
- 重启WMS服务
一.重启API服务 查看进程ps ef|grep java 进入目录 cd /usr/local/tomcat-api/bin ./shutdown.sh ps –ef|grep 查看服务是否真的停止 ...
- Qt编写自定义控件62-探探雷达
一.前言 随着移动互联网的盛行,现在手机APP大行其道,每个人的手机没有十几个APP都不好意思说自己是现代人,各种聊天.购物.直播.小视频等APP,有个陌生人社交的APP叫探探,本人用过几次,当然不是 ...
- 【437】Binary search algorithm,二分搜索算法
Complexity: O(log(n)) Ref: Binary search algorithm or 二分搜索算法 Ref: C 版本 while 循环 C Language scripts b ...