【剑指offer-解题系列(32)】整数区间中出现1的个数
来源:互联网 发布:汽车零部件进出口数据 编辑:程序博客网 时间:2024/05/21 11:11
题目描述
求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。
分析
较为复杂的分析:
对于一个数字,如55342
1、对于个位,由于是十进制,所以每10个数出现一个1,那么总共多少个10呢,就是5534个10,
也就是十位数之前的数字,而2大于等于1,所以还要加上1.
2、对于十位,每100个数中会出现10个1,(10,11,12,13...),总共553个100,而如果十位数大于1那么就是553*10个1,
.......
对于个位:假设个位数是number(2),个位数之前截取结果为weight(5534),1的总数为res
如果number>=1,res = weight+1,
否则,res=weight
对于十位:假设十位数是number(3),十位数之前截取结果为weight(553),1的总数为res,十位数之后的截取结果为former (4)
如果number>1,res = weight*10,如果number==1,res =(weight)*10+former+1
如果number<1,res = (weight)*10,
对于百位:假设百位数是number(5),十位数之前截取结果为weight(5),1的总数为res,十位数之后的截取结果为former(34)
如果number>1,res = weight*100,如果number==1,res =(weight)*100+former+1
如果number<1,res = (weight)*100,
.。。。。。。
代码实现
int NumberOf1Between1AndN_Solution(int n)
{
int former=0,weight=0,number=0;
int res = 0;
int base = 1;
while(n!=0){
number = n%10;
weight = n/10;
if(base == 1){
if(number>=1)
res += weight+1;
else
res += weight;
}
else{
if(number>1)
res += (weight+1)*base;
if(number==1)
res += (weight)*base+former+1;
if(number<1)
res += (weight)*base;
}
former+=number*base;
base*=10;
n=n/10;
}
return res;
}
阅读全文
0 0
- 【剑指offer-解题系列(32)】整数区间中出现1的个数
- 【剑指offer-解题系列(10)】二进制中1的个数
- 剑指Offer系列-面试题32:从1到n整数中1出现的次数
- 【剑指offer-解题系列(30)】最小的K个数
- 【剑指offer-解题系列(12)】数值的整数次方
- 剑指offer 32 整数中1出现的次数
- 剑指offer 32 整数中1出现的次数
- 【剑指offer-解题系列(29)】数组中出现次数超过一半的数
- 【剑指offer-解题系列(38)】数字在排序数组中出现的次数
- 【剑指offer-解题系列(40)】数组中只出现一次的数字
- 【剑指offer】统计二进制整数中1的个数
- 剑指offer—整数中1的个数
- 剑指offer系列之30:从1到n整数中1出现的次数
- 剑指offer系列之三十:整数中1出现的次数
- 十进制整数区间[1, N]中数字1出现的个数
- 剑指offer中,求输入整数的二进制形式中1的个数(Java代码)
- 《剑指offer》整数中1出现的次数(从1到n整数中1出现的次数)
- 剑指offer--整数中1出现的次数(从1到n整数中1出现的次数)
- LeetCode 561. Array Partition I
- 【数组模拟链表】UVA
- Spring线程池和自定义线程池的使用
- 06-图1 列出连通集 (25分) C++
- 2017.5.27入门组总结
- 【剑指offer-解题系列(32)】整数区间中出现1的个数
- 第6课
- freemarker的应用
- Http协议详解
- Linux总结笔记3-磁盘管理RAID,LVM
- Java内存模型
- [jzoj3757]【NOI2014】随机数生成器
- java面试基础之三
- 文章标题