32:从1到n整数中1出现的次数
import java.util.Arrays;
/**
* 面试题32:从1到n整数中1出现的次数 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?
* 为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。
* ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。
*/
public class _32_num_1_times {
public static void main(String[] args) {
Solution32 solution32 = new Solution32();
System.out.println(solution32.NumberOf1Between1AndN_Solution(11));
}
}
class Solution32 {
public int NumberOf1Between1AndN_Solution(int n) {
if (n <= 0) {
return 0;
}
int[] num = getNum(n);
return getNumTimes(num);
}
public int[] getNum(int n) { // 数字转换位数组
int len = String.valueOf(n).length();
int[] num = new int[len];
int index = len - 1;
while (n > 0) {
int tmp = n % 10;
num[index--] = tmp;
n = n / 10;
}
return num;
}
public int getNumTimes(int[] num) { // 递归函数
if (num.length == 0) {
return 0;
}
if (num[0] < 0 || num[0] > 9) {
return 0;
}
int len = num.length;
int head = num[0];
if (len == 1 && head == 0) {
return 0;
}
if (len == 1 && head == 1) {
return 1;
}
int headNum = 0;
// 以21345为例
// 万位个数
if (head > 1) {
headNum = (int) Math.pow(10, len - 1);
} else if (head == 1) {
int tmp = 0;
for (int j = 1; j < len; j++) {
tmp = tmp * 10 + num[j];
}
System.out.println("tmp=" + tmp);
headNum = tmp + 1;
}
System.out.println("headNum=" + headNum);
int deleteHeadNum = 0;
// 万位剩下4位个数
deleteHeadNum = head * (len - 1) * ((int) Math.pow(10, len - 2));
// 递归千位
int numRecursion = getNumTimes(Arrays.copyOfRange(num, 1, len));
return headNum + deleteHeadNum + numRecursion;
}
}
32:从1到n整数中1出现的次数的更多相关文章
- 剑指Offer:面试题32——从1到n整数中1出现的次数(java实现)
问题描述: 输入一个整数n,求1到n这n个整数的十进制表示中1出现的次数.例如输入12,从1到12这些整数中包含1的数字有1,10,11,12,1一共出现了5次. 思路:(不考虑时间效率的解法,肯定不 ...
- 32 从1到n整数中1出现的次数
输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数. 主要思路:设定整数点(如1.10.100等等)作为位置点i(对应n的各位.十位.百位等等),分别对每个数位上有多少包含1的点进行分析 ...
- 面试题32.从1到n整数中1出现的次数
题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数.例如输入12,从 1到12这些整数中包含1的数字中1,10,11和12,1一共出现了5次 本题可以直接变量1到n的n个数然后分别计 ...
- 【剑指offer】面试题32:从1到n整数中1出现的次数
题目: 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了.A ...
- 【面试题032】从1到n整数中1出现的次数
[面试题032]从1到n整数中1出现的次数 题目: 输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数. 例如输入12,从1到12这些整数中包含1的数字有1,10,11和1 ...
- [剑指Offer] 31.整数中1出现的次数
题目描述 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了. ...
- 整数中1出现的次数(从1到n整数中1出现的次数)
题目:求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了.AC ...
- 题目1373:整数中1出现的次数(从1到n整数中1出现的次数)
题目1373:整数中1出现的次数(从1到n整数中1出现的次数) 题目描述: 亲们!!我们的外国友人YZ这几天总是睡不好,初中奥数里有一个题目一直困扰着他,特此他向JOBDU发来求助信,希望亲们能帮帮他 ...
- 剑指Offer 整数中1出现的次数(从1到n整数中1出现的次数)
题目描述 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了. ...
随机推荐
- 手把手教你使用webpack搭建vue框架
我们在使用vue开发项目的时候,都是用vue-cli直接来搭建的.但是这是别人已经造好的轮子,我们既然要使用别人造好的轮子,我们总不能知其然而不知其所以然.所以呢,我这边文章就教你如何使用webpac ...
- bzoj千题计划121:bzoj1033: [ZJOI2008]杀蚂蚁antbuster
http://www.lydsy.com/JudgeOnline/problem.php?id=1033 经半个下午+一个晚上+半个晚上 的 昏天黑地调代码 最终成果: codevs.洛谷.tyvj上 ...
- pandas 实现rfm模型
import pandas as pd import numpy as np df = pd.read_csv('./zue_164466.csv') df['ptdate'] = pd.to_dat ...
- SpringBoot 线程池配置 实现AsyncConfigurer接口方法
目的是: 通过实现AsyncConfigurer自定义线程池,包含异常处理 实现AsyncConfigurer接口对异常线程池更加细粒度的控制 *a) 创建线程自己的线程池 b) 对void ...
- 在EF6.0中打印数据库操作日志
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 【树】ztree
ztree前端参见官网http://www.ztree.me/v3/main.php Action示例 public String initLabServerTree(){ return SUCCES ...
- 【微服务架构】SpringCloud之Ribbon
一:Ribbon是什么? Ribbon是Netfix发布的开源项目,主要负责客户端的软件负载均衡算法,将Netfix的中间层连接在一起,Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等. ...
- [转]ubuntu16.04~qt 5.8无法输入中文
编译fcitx-qt需要cmake,安装cmake命令,如果已经安装,请略过. sudo apt-get install cmake 安装 fcitx-libs-dev sudo apt-get in ...
- mysql条件查询中AND与OR联合使用的注意事项!
mysql查询中经常会用到AND与OR一起使用的情况,可如果写法不对,往往会起到相反的效果,这不,前几天就碰到了,最后测试果然提了一堆bug!!!! 废话就不多说了,主要总结一下几点: 一 当mysq ...
- crond检查服务状态
代码如下: * */1 * * * /etc/init.d/ntpd status;if [ $? -ne 0 ];then /etc/init.d/ntpd start; fi