劍指offer(31)—整數1出現的次數
阿新 • • 發佈:2019-02-15
題目描述
求出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);
}
};