剑指Offer-31.整数中1出现的次数(从1到n整数中1出现的次数)(C++/Java)
2024-08-31 19:38:46
题目:
求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。
分析:
可以编写一个判断一个数字有多少个1的函数,然后遍历1-n依次调用统计函数,最后求和即可,不过这样时间复杂度有些多。
我们可以按数字的位数来依次统计1出现的个数,例如21345这个数,我们先看1346-21345区间1出现的个数。
先统计万位出现1的个数,我们知道,10000-19999,万位共出现了10000次,也就是10^4个1,考虑一下特殊情况,如果是12345这样的数,实际上万位出现1的个数就等于万位后面的数字加1,也就是2345+1=2346次。
再来计算后面,也就是其余4位1出现的次数1346-21345可以拆成两部分来看,一部分是1346-11345,每一段剩下的4位数字中,选择1位是1,其余三位可以选择0-9,也就是出现了10^3次,共4位所以也就是4*10^3次,同理剩下的部分11346-21345也是4*10^3次。
而剩下的1-1345区间出现1的个数可以通过递归求得。
程序:
C++
class Solution {
public:
int NumberOf1Between1AndN_Solution(int n)
{
int length = ;
int num = n;
while(num){
num /= ;
length++;
}
return helper(n, length);
}
int helper(int num, int length){
if(length == || num <= )
return ;
int numfirst = ;
int first = num / pow(length-);
if(length == && first > )
return ;
if(first > ){
numfirst = pow(length-);
}
if(first == ){
numfirst = num - pow(length-) + ;
}
int numother = first * (length - ) * pow(length-);
return numfirst + numother + helper(num - first*pow(length-), length-);
}
int pow(int num){
int res = ;
for(int i = ; i < num; ++i)
res *= ;
return res;
}
};
Java
public class Solution {
public int NumberOf1Between1AndN_Solution(int n) {
if(n <= 0)
return 0;
int res = 0;
while(n != 0){
res += helper(n);
n--;
}
return res;
}
public int helper(int n){
int count = 0;
while(n != 0){
if(n % 10 == 1)
count++;
n /= 10;
}
return count;
}
}
最新文章
- 【Go入门教程7】并发(goroutine,channels,Buffered Channels,Range和Close,Select,超时,runtime goroutine)
- try-catch
- [Compose] 20. Principled type conversions with Natural Transformations
- pandas 数据索引与选取
- codeforces 520 Pangram
- IOS学习之路- 运行过程
- SQL Server2008R2安装失败问题之语言包问题
- 关于Dropdownlist使用的心得体会
- openlayers 加载瓦片详解 一
- PAT1041: Be Unique
- [Swift]LeetCode667. 优美的排列 II | Beautiful Arrangement II
- MySQL sql_mode=only_full_group_by错误
- C# 远程服务器 创建、修改、删除 应用程序池 网站
- sentiwordnet的简单使用
- CSS 文本缩进,行间距
- homework 补第三题
- 30. Child Labor Problem and Its Solution 童工问题及解决方法
- PHP CLI模式下echo换行
- 转 CAS实现SSO单点登录原理
- NOIP2013 DAY2题解
热门文章
- AoE 搭档 TensorFlow Lite ,让终端侧 AI 开发变得更加简单。
- vue解惑之v-on(事件监听指令)
- 在Dynamics CRM中使用Bootstrap
- fiddler教程:抓包带锁的怎么办?HTTPS抓包介绍。
- [转]BEC Vantage
- CODING 受邀参与 DevOps 标准体系之系统和工具&;技术运营标准技术专家研讨会
- 追踪SQL Server执行delete操作时候不同锁申请与释放的过程
- SQL Server如何正确的删除Windows认证用户
- Linux系统学习 十、DHCP服务器—介绍和原理
- SQL Server事务复制(sql 2008 r2)