🏆个人主页:企鹅不叫的博客
🌈专栏
⭐️ 博主码云gitee链接:代码仓库地址
⚡若有帮助可以【关注+点赞+收藏】,大家一起进步!
💎一、题目
🏆1.题目描述
🏆2.原题链接
💎二、解题报告
🏆1.思路分析
🔑思路:
参考:【动画模拟】我太喜欢这个题了
我们要统计1出现的次数,我们只要将每一个位上面的1的个数统计出来就可以了。
假设这个数是n,那么我们直接遍历n的每一个就可以求出1的个数
我们设置当前指向的数位置是位因子,定义左边为高位,右边为低位,count为1出现的次数,cur为当前位因子的数字,num表示当前位因子的位数。
下面我们就要讨论当前位(cur==0 ),cur ==1, cur>1三种情况,我们用n ==1004举例
当cur = 0时, n == 1004
小于1004的情况下,最小的为10,最大的为919,高两位出现的情况有00~09十种情况,低位上也有0 ~ 9十种情况,所以
count = numhigh
其实就是0010~0919中,固定住中间的1,移动其他几个,看看有多少种组合
当cur == 1时, n == 1014
十位上为1的最小数字为10,十位上为1的最大数字是1014,所以范围就是10~1014,我们只要固定住十位上面的1,移动其他位置就好了。
我们将1014分成两段,也就是0000~1004,和1005 ~ 1014,前面一段中十位出现1的情况我们已经知道如何求得,为1010 == 100次,当1004 ~ 1014这一段中十位为1的情况,这一段中最小位出现1的数为1010,最大为1014,此时高位不动,低位可以是0 ~ 4,就是五种情况,低位+1
当cur > 1时, n == 1024
其中最小的为 0010,最大的为 1019
我们也可以将其拆成两段 0010 ~ 0919,1010 ~ 1019,高位数字 * num + num, 10 * 10 + 10 得到 1 出现的次数
🏆2.代码详解
class Solution {
public:
int countDigitOne(int n) {
int hight = n;
int low = 0;
int count = 0;
long long num = 1;
int cur = 0;
while(hight != 0 || cur != 0)
{
cur = hight%10;
hight /= 10;
if(cur == 0) count += hight*num;
else if(cur == 1) count += hight*num+1+low;
else count += num*(hight+1);
low = cur*num+low;
num *= 10;
}
return count;
}
};
hight是高位,low是低位,count是计数,num是当前位因子的位数,cur是当前位因子
之后就是取出cur一位一位比较,然后依次移动hight和low和num
最后返回count