剑指Offer-31.整数中1出现的次数(从1到n整数中1出现的次数)(C++/Java)
题目:
求出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;
}
}
剑指Offer-31.整数中1出现的次数(从1到n整数中1出现的次数)(C++/Java)的更多相关文章
- 剑指 Offer 31. 栈的压入、弹出序列 + 入栈顺序和出栈顺序的匹配问题
剑指 Offer 31. 栈的压入.弹出序列 Offer_31 题目详情: 解析: 这里需要使用一个栈来模仿入栈操作. package com.walegarrett.offer; /** * @Au ...
- 剑指 Offer 31. 栈的压入、弹出序列
剑指 Offer 31. 栈的压入.弹出序列 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如,序列 {1,2,3,4,5} 是某 ...
- 【强烈推荐】《剑指Offer:名企面试官精讲典型编程题》一书中IT名企经典面试题
各位程序猿: <剑指Offer>一书源自该书作者何海涛坚持更新与编写的博客(http://zhedahht.blog.163.com/),该博客收集整理了大量如微软.Goo ...
- 【Java】 剑指offer(31) 栈的压入、弹出序列
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否 ...
- 【剑指Offer面试编程题】题目1508:把字符串转换成整数--九度OJ
题目描述: 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 输入: 输入可能包含多个测试样例. 对于每个测试案例,输入为一个合法或者非法的字符串,代表一个整数n(1<= n&l ...
- 剑指Offer 31. 整数中1出现的次数(从1到n整数中1出现的次数) (其他)
题目描述 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了. ...
- 剑指offer第12题打印从1到n位数以及大整数加法乘法
字符和数字加减就是字符的ASCII码和数字直接加减. 方法一: 1)在字符串操作中给一个整形数字加(字符0)就是把它转化为字符,当然给一个字符减去(字符0)就可以把它转化为数字了:如果确实是最后 ...
- [剑指Offer] 31.整数中1出现的次数
题目描述 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了. ...
- 剑指offer——31序列化二叉树
题目描述 请实现两个函数,分别用来序列化和反序列化二叉树 二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存.序列化可以基于先 ...
- 每日一题 - 剑指 Offer 31. 栈的压入、弹出序列
题目信息 时间: 2019-06-25 题目链接:Leetcode tag:栈 难易程度:中等 题目描述: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入 ...
随机推荐
- SpringMVC架构模拟
这次来学习一下SpringMVC的源码. 对于常见的项目架构模式,比如大名鼎鼎的SSM(SpringMVC,Spring,Mybatis)框架. SpringMVC ->web层(Control ...
- 3.Python常用逻辑运算符
#header { /* Initially hidden to prevent FLOUC */ display: none; background-color: #fff; /* Display ...
- vue2.0 知识体系示意图
- 更改Android studio中SDK,AVD的默认路径
对于大部分首次下载android studio开发android的人来说, 由于Android Studio将会默认把SDK,AVD下载到我们的C盘,造成大量内存的占用,那么如何更改SDK,AVD的路 ...
- 「漏洞预警」Apache Flink 任意 Jar 包上传导致远程代码执行漏洞复现
漏洞描述 Apache Flink是一个用于分布式流和批处理数据的开放源码平台.Flink的核心是一个流数据流引擎,它为数据流上的分布式计算提供数据分发.通信和容错功能.Flink在流引擎之上构建批处 ...
- 初级模拟电路:3-11 BJT实现电流源
回到目录 1. 恒流源 (1)简易恒流源 用BJT晶体管可以构造一个简易的恒流源,实现电路如下: 图3-11.01 前面我们在射极放大电路的分压偏置时讲过,分压偏置具有非常好的稳定性,几乎不受晶体管的 ...
- node_modules/.bin/babel : 无法加载文件 D:\node\node_project\es6\node_modules\.bin\babel.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.co m/fwlink/?LinkID=135170 中的 about_Execution_Policies。
刚入门es6,遇到上面问题,然后 解决方案: 以管理员身份运行vs code执行:get-ExecutionPolicy,显示Restricted,表示状态是禁止的执行:set-ExecutionPo ...
- 附007.Kubernetes ABAC授权
一 ABAC 1.1 ABAC授权 基于属性的访问控制(ABAC)定义了访问控制范例,通过使用将属性组合在一起的策略向用户授予访问权限. 使用--authorization-policy-file=S ...
- SpringData JPA实现增删改
一.创建实体类并自动生成数据库表 二.dao层继承JpaRepository 三.controller中增加操作 四.controller中删除操作 五.controller中修改操作
- Ubuntu 合上笔记本不会进入休眠模式
首先 sudo vim /etc/systemd/logind.conf 把文件中的 #HandleLidSwitch=suspend 修改成 HandleLidSwitch=ignore 重启服务 ...