剑指offer(31)—整数1出现的次数

来源:互联网 发布:赵薇事件公知 编辑:程序博客网 时间:2024/06/07 10:50

题目描述

求出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);    }};
阅读全文
0 0
原创粉丝点击