Day31:整数中1出现的次数
剑指Offer_编程题——整数中1出现的次数(从1到n整数中1出现的次数)
题目描述:
求出1-13的整数中1出现的次数,并算出100-1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。
具体要求:
时间限制: C/C++ 1秒,其他语言2秒 空间限制: C/C++32M,其他语言64M
具体思路:
由于本题比较简单,因此思路也是很清晰,其中最直接的就是遍历i到n,把每个整数转化为string,然后转化做char[],判断每一位上1的个数。具体分别用java和python实现。 1、首先用java实现:
public class Solution{
public int NumberOf1Between1AndN_Solution(int n){
if(n <= 0)
return 0;
int sum = 0;
for(int i = 1; i <= n; i++){
char[] cs = String.valueOf(i).toCharArray();
for(char c: cs){
if(c - '1' == 0)
sum++;
}
}
return sum;
}
}
代码效果图如图所示:
2、接下来我们用python实现
class Solution:
def NumberOf1Between1AndN_Solution(self, n):
if n < 1:
return 0
mult, sumTimes = 1, 0
while n // mult:
div, mod = divmod(n, mult*10)
curNum, curMod = divmod(mod, mult)
if curNum > 1:
sumTimes += div * mult + mult
elif curNum == 1:
sumTimes += div * mult + curMod + 1
else:
sumTimes += div*mult
mult = mult * 10
return sumTimes
代码效果图如图所示:
以上做法尽管代码可以通过测试,并且思路很清晰,很好实现。但是由于需要额外的空间来保存每个数字转化为字符的数组,有点浪费空间,因此我们可以直接用数字除十来求值取余即可。大大减少了空间的浪费,提高了代码运行的速度。我们也用java和python将其实现。 1、首先用java实现呢:
public class Solution{
public int NumberOf1Between1AndN_Solution(int n) {
int cnt = 0;
for (int m = 1; m <= n; m *= 10) {
int a = n / m, b = n % m;
cnt += (a + 8) / 10 * m + (a % 10 == 1 ? b + 1 : 0);
}
return cnt;
}
}
代码效果图如图所示:
2、接下来用python实现
class Solution:
def NumberOf1Between1AndN_Solution(self, n):
mult, sumTimes = 1, 0
while n // mult > 0:
high, mod = divmod(n, mult*10)
curNum, low = divmod(mod, mult)
if curNum > 1:
sumTimes += high * mult + mult
elif curNum == 1:
sumTimes += high * mult + low + 1
else:
sumTimes += high * mult
mult = mult * 10
return sumTimes
代码效果图如图所示:
本来此题到此为止已经结束了,但是如果我们把题目稍微的拓展一下,即将整数中1出现的次数改为**整数中任意数X出现的次数。**即原来的题目变为:
求出1-13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1-13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中任意整数x出现的次数(从1 到 n 中X出现的次数)。
其实还是和之前提到的差不多,只需要将原来的判断条件1换成x即可,具体用python实现如下:
class Solution:
def NumberOfXBetween1AndN_Solution(self, n, x):
mult, sumTimes = 1, 0
while n // mult > 0:
high, mod = divmod(n, mult * 10)
curNum, low = divmod(mod, mult)
if curNum > x:
sumTimes += high * mult + mult
elif curNum == x:
sumTimes += high * mult + low + 1
else:
sumTimes += high * mult
mult = mult * 10
return sumTimes
总结
本道题主要是简单的考察了从数字1-n中1出现的次数,这个题目思路很清晰,我们分别用java和python很容易就实现了,但是,发现其效率执行很低,关键还浪费了很多的空间,因此,我们又找到了一种改进的方式,直接用数学中的取整和取模来进行优化,并且分别用java和python将其实现。发现其空间和时间复杂度均降低了不少。另外,我们还将此题扩展了一下,将从1~n整数中1出现的次数改为了从1-n整数中任意数x出现的次数,并且用python将其实现。因此,我们在做题的时候,应该多次尝试各种方法,扩展自己的思维,写出优质的代码。总之,我们要继续加油,争取早日找到工作,Good Luck!!!
参考文献
- python实现字符串模糊匹配
- 动态规划之01背包详解【解题报告】
- hihoCoder #1078 : 线段树的区间修改(线段树区间更新板子题)
- HDU 2546 饭卡(01背包裸题)
- 漫谈文件系统
- AI知识搜索利器:基于ElasticSearch构建专知实时高性能搜索系统
- 【深度干货】专知主题链路知识推荐#5-机器学习中似懂非懂的马尔科夫链蒙特卡洛采样(MCMC)入门教程01
- hihoCoder #1043 : 完全背包(板子题)
- 【深度干货】专知主题链路知识推荐#7-机器学习中似懂非懂的马尔科夫链蒙特卡洛采样(MCMC)入门教程02
- hihoCoder #1038 : 01背包(板子题)
- 最小二乘法多项式曲线拟合原理与实现
- HDU 1166 敌兵布阵(线段树单点更新,板子题)
- 一文看懂ovirt的supervdsmd服务
- openstack如何扩展API之二:扩展原有核心API
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- python对一个数向上取整的实例方法
- Laravel框架FormRequest中重写错误处理的方法
- python名片管理系统开发
- PHP封装mysqli基于面向对象的mysql数据库操作类与用法示例
- PHP实现微信商户支付企业付款到零钱功能
- yii2 开发api接口时优雅的处理全局异常的方法
- PHP调用全国天气预报数据接口查询天气示例
- Python使用itcaht库实现微信自动收发消息功能
- Laravel源码解析之路由的使用和示例详解
- PHP实现的用户注册表单验证功能简单示例
- php使用mysqli和pdo扩展,测试对比连接mysql数据库的效率完整示例
- 微信企业转账之入口类分装php代码
- python输出结果刷新及进度条的实现操作
- PHP实现微信申请退款功能
- python 读取.nii格式图像实例