【剑指offer】面试题32:从1到n整数中1出现的次数
题目:
求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。
思路:
比如求1到34597中1出现的次数。首先划分两段:1到4597,4598到34597.
第二段的话,最高位1出现的次数为10000~19999,总共10000次(假设n的位数为b,即10的b次方个);另一部分是其他位的1。
对于求其他位的1,将第二段再次划分:4598到14597,14598到24597,24598到34597.对于每一段,选定一位为1时,其余位置可以为0~9中任意一个,则每段有10X10X10X3个;总共有10X10X10X3X3个。即10的(b-2)次方乘以(b-2)乘以最高位数字。
这样,整个第二段4598到34597的个数求得,对于第一段用递归方法求即可。
总结,可以将1到n划分为这样几步:(假设n的位数为len,最高位数字为first,n也记为abxxx...)
A. 从1到bxxx... 递归求解
B.a 从bxxx...+1到abxxx...的最高位1个数:如果first>1,则为10的first次方;否则为bxxx...+1个。
B.b 从bxxx...+1到abxxx...的除最高位有1外,其他位1的个数:10的(len-2)次方乘以(len-1)乘以first个。
注意:
实现的时候,可以用字符串来处理数字n。这样去掉最高位后的数字,只需要将字符指针加1即可。
需要注意的输入:长度为1,且first为0;长度为1,且first>0。(因为后面有len-2)
代码:
class Solution {
public:
int NumberOf1Between1AndN_Solution(int n)
{
if(n<=) return ;
char s[];
sprintf(s,"%d",n);
return NumberOf1(s);
}
private:
int NumberOf1(char *s)
{
if(s==NULL || *s<'' || *s>'' || *s=='\0') return ;
int len=strlen(s);
int first=s[]-'';//最高位数字
if(len==1 && first==0) return 0;
if(len==1 && first>0) return 1;
int numFirstDigit=;//最高位的1的个数
if(first>) numFirstDigit=PowerOf10(len-);
else if(first==)
numFirstDigit=atoi(s+1)+;
int numOtherDigit=;//其他位的1的个数
if(len>=)
numOtherDigit=PowerOf10(len-)*first*(len-1);
int numRecursive=NumberOf1(s+);//递归求解的1的个数
return numFirstDigit+numOtherDigit+numRecursive;
}
int PowerOf10(int n)
{
int res=;
for(int i=;i<n;++i)
{
res=res*;
}
return res;
}
};
讨论:
在B.b的求个数过程中,是不是有重复的,比如选定第二位为1时,其他位可以从0到9任选,而选定第三位为1时,其他为又是从0到9任选。这样,对于形如”第二位为1、第三位为1“的数字,则重复计算了。
同样,B.b和B.a的计算中,好像也是有重复计算了的。
是我理解错了吗?求讨论。
答:我理解错了,并没有重复计数。
【剑指offer】面试题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次. 思路:(不考虑时间效率的解法,肯定不 ...
- 【剑指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个数然后分别计 ...
随机推荐
- ZOJ3765---Lights (Splay伸展树)
Lights Time Limit: 8 Seconds Memory Limit: 131072 KB Now you have N lights in a line. Don't wor ...
- Visual Studio 2012 编译C++显示cl命令
为了用newlisp来实现VC编译,以便用我的Emacs开发VC程序,而不需要再打开VS 2012, 需要自己实现命令行的编译.我不需要nmake,因为我想直接了解VC编译器,以便今后更好的驾驭它. ...
- Highcharts 点击反选
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...
- C++ Primer 学习笔记_84_模板与泛型编程 --模板特化
模板与泛型编程 --模板特化 引言: 我们并不总是能够写出对全部可能被实例化的类型都最合适的模板.某些情况下,通用模板定义对于某个类型可能是全然错误的,通用模板定义或许不能编译或者做错误的事情;另外一 ...
- sql获取每门课程成绩最好的学生信息
1.相关数据表 Score表 [User]表 SQL语句例如以下: --查询出各科成绩最好的学生信息 --自连接 --SELECT TOP 1 * FROM Score B WHERE B.Score ...
- [Cycle.js] The Cycle.js principle: separating logic from effects
The guiding principle in Cycle.js is we want to separate logic from effects. This first part here wa ...
- [Cycle.js] Main function and effects functions
We need to give structure to our application with logic and effects. This lessons shows how we can o ...
- AAM(Active Appearance Model)算法介绍
前面介绍ASM算法(http://blog.csdn.net/carson2005/article/details/8194317)的时候,笔者提到,ASM是基于统计形状模型的基础上进行的,而AAM则 ...
- mysql判断某个字符串是否包含另一个
like SELECT * FROM wx_webauth_userinfo where city LIKE "%台%";"; 结果: 函数find_in_set(str ...
- View事件传递之父View和子View之间的那点事
Android事件传递流程在网上可以找到很多资料,FrameWork层输入事件和消费事件,可以参考: Touch事件派发过程详解 这篇blog阐述了底层是如何处理屏幕输,并往上传递的.Touch事件传 ...