面试题43:1~n整数中1出现的次数
文章目录
题目
输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。
例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。
考点
找规律
先考虑最高位,最高位分为是否大于1考虑最高位1出现次数
再考虑除最高位剩下几位中1出现的次数,此时计算1出现的次数采用排列组合的方式
再递归考虑除最高位剩下的尾数部分
LeetCode版本
class Solution {
public:
int dealnum(const char *num){
if(num == nullptr)return 0l
int len = strlen(num);
int first = *num - '0';
if(len == 0) return 0;
if(len == 1 && first >= 1) return 1;
if(len == 1 && first == 0) return 0; //要考虑数字为0的情况
int hightestnum(0),othernum(0),tailnum(0);
if(first == 1) hightestnum = atoi(num+1) + 1;
if(first > 1) hightestnum = pow(10,len-1);
othernum = firtst * (len-1)*pow(10,len-2);
tailnum = dealnum(num+1);
return hightestnum + othernum + tailnum;
}
int countDigitOne(int n) {
char num[50];
snprintf(num,sizeof(num)-1,"%d",n);
return dealnum(num);
}
};