剑指offer(31)—整数1出现的次数
2017-09-12 19:55
309 查看
题目描述
求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。思路
1、暴力求解法:依次求出1~n的每个数中所含的1的个数,通过对10取余判断个位数是否为1来计算;2、分析数据找规律,举例分析,以21345为例。
代码
class Solution { public: int PowBase10(int n){ //10^n int res = 1; for(int i = 0; i < n; i++) res *= 10; return res; } int NumOf1(char *str){ if(!str || *str<'0' || *str>'9' || *str=='\0') //特殊情况处理 return 0; int first = *str-'0'; int len = strlen(str); if(len==1 && first ==0) //0 return 0; if(len==1 && first > 0) //1~9 return 1; int numFirstDigit = 0; //第一位中1的数目 if(first > 1) numFirstDigit = PowBase10(len - 1); else if(first == 1) numFirstDigit = atoi(str+1) + 1; int numOtherDigits = 0; //其他位中1的数目 numOtherDigits = PowBase10(len-2) * first * (len - 1); int numRecursive = NumOf1(str+1); return numFirstDigit + numOtherDigits + numRecursive; } int NumberOf1Between1AndN_Solution(int n) { if(n<=0) return 0; char str[50]; sprintf(str,"%d",n); return NumOf1(str); } };
相关文章推荐
- 剑指offer——31.整数中1出现的次数
- 从1到n整数中1出现的次数——剑指offer面试题32
- 剑指offer-32从1到n整数出现1的次数
- 31.整数中1出现的次数(从1到n整数中1出现的次数
- 剑指offer——面试题32:从1到n整数中1出现的次数
- 《剑指offer》-整数中1出现的次数
- 剑指offer-面试题32.从1到n整数中1出现的次数
- 剑指offer——面试题32:从1到n整数中1出现的次数
- 《剑指offer》刷题笔记(时间效率):整数中1出现的次数
- 《剑指offer》——整数中1出现的次数(从1到n整数中1出现的次数)
- 31 整数中1出现的次数(从1到n整数中1出现的次数)
- 剑指offer系列之三十:整数中1出现的次数
- (剑指Offer)面试题32:从1到n整数中1出现的次数
- 剑指offer-整数中1出现的次数(从1到n整数中1出现的次数)
- 剑指offer(16)-从1到n整数中1出现的次数
- 《剑指offer》面试题32----从1到n整数中1出现的次数
- 剑指offer——整数中1出现的次数(从1到n整数中出现1的次数)可优化
- 剑指offer-31.整数中1出现的次数(从1到n整数中1出现的次数)
- [置顶] 剑指offer:第32题从1到n整数中1出现的次数
- 剑指offer-整数中1出现的次数