剑指Offer:面试题32——从1到n整数中1出现的次数(java实现)
问题描述:
输入一个整数n,求1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含1的数字有1,10,11,12,1一共出现了5次。
思路:(不考虑时间效率的解法,肯定不是面试官期望的)
直观想法:累加1到n中每个整数中1出现的次数。
每个整数中1出现的次数可以由除以10和模10来计算得到。
代码如下:
boolean invalidInput = false;
//不考虑时间效率的解法
public int NumberOf1Between1AndN_Solution(int n) {
if(n <= 0){
invalidInput = true;
return 0;
}
int number = 0;
for(int i = 1; i <= n; i++){
number += NumberOf1(i);
}
return number;
}
public int NumberOf1(int n){
int number = 0;
while(n > 0){
if(n % 10 == 1){
number++;
}
n = n/10;
}
return number;
}
思路2:从数字规律着手明显提高时间效率的解法,能让面试官耳目一新
首先将1-n根据最高为分成两段,比如1-21345,分为1-1345与1346-21345
从最高位开始,每次分析最高位出现1的次数(用字符串)。然后剥去最高位进行递归求解。
代码:
public class Solution {
boolean invalidInput = false;
//时间复杂度为O(logn)
public int NumberOf1Between1AndN_Solution(int n) {
if(n <= 0){
invalidInput = true;
return 0;
}
StringBuilder s = new StringBuilder(((Integer)n).toString());
return NumberOf1(s);
}
int NumberOf1(StringBuilder s){
if(s == null || s.length() == 0 || s.charAt(0) < '0' || s.charAt(s.length()- 1) > '9'){
return 0;
}
int first = s.charAt(0) - '0';
int length = s.length();
if(length == 1 && first == 0){
return 0;
}
if(length == 1 && first > 0){
return 1;
}
//假设n = 21345
//numFirstDigit是数字10000 - 19999 的第一个位中的数目
int numFirstDigit = 0;
if(first > 1){
numFirstDigit = PowerBase10(length - 1);
}else if(first == 1){
numFirstDigit = Integer.parseInt(s.substring(1)) + 1;
}
//numOtherDigits是1346 - 21345除了第一位之外的数位中的数目
int numOtherDigits = first * (length - 1) * PowerBase10(length - 2);
//numRecursive是1 - 1345中的数目
int numRecursive = NumberOf1(s.deleteCharAt(0));
return numFirstDigit + numOtherDigits + numRecursive;
}
int PowerBase10(int n){
int result = 1;
for(int i = 0; i < n; i++){
result *= 10;
}
return result;
}
}
剑指Offer:面试题32——从1到n整数中1出现的次数(java实现)的更多相关文章
- 【剑指Offer面试编程题】题目1373:整数中1出现的次数--九度OJ
题目描述: 亲们!!我们的外国友人YZ这几天总是睡不好,初中奥数里有一个题目一直困扰着他,特此他向JOBDU发来求助信,希望亲们能帮帮他.问题是:求出1~13的整数中1出现的次数,并算出100~130 ...
- 剑指Offer的学习笔记(C#篇)-- 整数中1出现的次数(从1到n整数中1出现的次数)
题目描述 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了. ...
- 【剑指Offer】31、从1到n整数中1出现的次数
题目描述: 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他 ...
- 【剑指Offer面试题】 九度OJ1517:链表中倒数第k个结点
鲁棒性是指程序可以推断输入是否符合规范要求,并对不和要求的输入予以 合理的处理. 题目链接地址: http://ac.jobdu.com/problem.php?pid=1517 题目1517:链表中 ...
- 剑指offer——面试题32.1:分行从上到下打印二叉树
void BFSLayer(BinaryTreeNode* pRoot) { if(pRoot==nullptr) return; queue<BinaryTreeNode*> pNode ...
- 剑指offer——面试题32:从上到下打印二叉树
void BFS(BinaryTreeNode* pRoot) { if(pRoot==nullptr) { cout<<"empty binary tree!"< ...
- 【剑指offer 面试题38】数字在排序数组中出现的次数
思路: 利用二分查找,分别查找待统计数字的头和尾的下标,最后做差加一即为结果. C++: #include <iostream> #include <vector> using ...
- 剑指offer——面试题15.2:判断两个整数m和n的二进制中相差多少位
#include"iostream" using namespace std; int CountDifferentBit(int m,int n) { ,diff=m^n; wh ...
- 面试题32.从1到n整数中1出现的次数
题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数.例如输入12,从 1到12这些整数中包含1的数字中1,10,11和12,1一共出现了5次 本题可以直接变量1到n的n个数然后分别计 ...
随机推荐
- code标签和pre标签
code标签: 1.code标签的定义: <code>标签, 用于表示计算机源代码或者其他机器可以阅读的文本内容.软件代码的编写者习惯了编写代码时的代码格式,那么这个<code> ...
- CPU的栈机制的一个小问题
比如要实现下面这个功能. 我们如果要在10000H处写入自行数据2266H,不能用“mov 内存单元, 寄存器”这类指令.怎么做? 代码: mov ax, 1000h mov ss, ax mov s ...
- java的三大框架(三)---Hibernate
一.什么是映射 这里所说的映射就是对象关系映射:将对象数据保存到数据库中,同时可以将数据库数据读入对象中,开发人员只对对象进行操作就可以完成对数据库数据的操作. 二.什么是基本映射 知道了什么是映射, ...
- C# DataGridView自定义分页控件
好些日子不仔细写C#代码了,现在主要是Java项目,C#.Net相关项目不多了,有点手生了,以下代码不足之处望各位提出建议和批评. 近日闲来无事想研究一下自定义控件,虽然之前也看过,那也仅限于皮毛,粗 ...
- 一触即发 App启动优化最佳实践
一触即发 App启动优化最佳实践 本文在 DiyCode 和 CSDN个人博客 同时首发,关注作者的 DiyCode帐号 或者 作者微博 可第一时间收到新文章推送. 文中的很多图都是Google性能优 ...
- kuangbin_SegTree D (POJ 2528)
讲道理我之前暂时跳过染色的题是因为总觉得有什么很高端的算法来query 直到我做了F题(ZOJ 1610)才发现就是个暴力统计.....也对 也就几万个长度单位而已.... F就不po上来了 选了有点 ...
- vue 2.0版本----》常用代码说明
------------------------------------------代码不显示-------------------------------------------- [v-cloak ...
- spring+mybatis整合读取不了配置文件
报错如下: java.sql.SQLException: unkow jdbc driver : ${jdbc.url}其余错误就不贴了,主要原因是没有读取到配置文件 读取配置文件代码: <be ...
- 使用SPM创建新组件
(前提:已经安装好了spm) 步骤如下:
- Perforce P4V,添加映射