剑指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#篇)-- 数字在排序数组中出现的次数
题目描述 统计一个数字在排序数组中出现的次数. 一 . 题目分析 该题目并不是难题,但该题目考察目的是正确的选择合适的查找方法.题目中有一个关键词是:排序数组,也就是说,该数组已经排好了,我一开始直接 ...
随机推荐
- css去除图片间隙
问题如下图 把图片转换成块状元素即可 .img{ display: block; } 解决后:
- Are query string keys case sensitive?
Are query string keys case sensitive? @gbjbaanb's answer is incorrect: The RFCs only specify the all ...
- Spring IOC的缓存
1.将上一篇的测试代码修改如下 public class SpringTest { public static void main(String[] args) { ClassPathResource ...
- windows环境下mosquitto环境搭建与mqtt测试
https://blog.csdn.net/pgpanda/article/details/51800865 工作需求,自己在windows下搭建了一个mosquitto环境测试mqtt 话不多说,直 ...
- Thread.currentThread与this的区别
在看多线程的时候,看到这个知识点,感觉需要验证一下. 一:线程自启动 1.程序 package com.jun.it.thread; public class MyThread extends Thr ...
- JEECG MiniDao优劣
Minidao 1.5.1 - 我认为这是一个不严谨的错误 - andotorg的个人空间 - OSCHINAhttps://my.oschina.net/antsdot/blog/1800832 M ...
- C++11 学习笔记 std::function和bind绑定器
C++11 学习笔记 std::function和bind绑定器 一.std::function C++中的可调用对象虽然具有比较统一操作形式(除了类成员指针之外,都是后面加括号进行调用),但定义方法 ...
- oracle存储过程中%type的含义
转: oracle存储过程中%type的含义 2018-11-07 11:43:56 lizhi_ma 阅读数 1361更多 分类专栏: 数据库 版权声明:本文为博主原创文章,遵循CC 4.0 B ...
- 标量子查询调优SQL
fxnjbmhkk4pp4 select /*+ leading (wb,sb,qw) */ 'blocker('||wb.holding_session||':'||sb.username||')- ...
- 123457123457#0#-----com.tym.PuzzleGame28--前拼后广--日常pt-tym
com.tym.PuzzleGame28--前拼后广--日常pt-tym