Leetcode每日一题-2021-8-13<数字 1 的个数;(规律)
Posted abestxun
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode每日一题-2021-8-13<数字 1 的个数;(规律)相关的知识,希望对你有一定的参考价值。
链接:https://leetcode-cn.com/problems/number-of-digit-one/
题意:给定数字n,计算所有小于等于n的非负数中1的个数和
思路:计算每一个位为1
的情况,对于某位,numl-i-numr
,numl
是前缀,numr
是后缀,计算i=1时前缀和后缀满足构成的数字小于n的种类数
对于前缀为[0,numl)
时,i=1
,则numr
可以为任何数,若numr
长度为m
,numr
共10^m
中,对应种类数为numl*10^m
对于前缀为numl
时,就需要根据i的情况来判断i=1
时的种类数
i==0
时,i
不能为1
,相应种类数为0
i==1
时,当i=1
,相应种类数为numr+1
(numr=0
的情况)
i>1
时,当i=1
,numr
可以为任何数 相应种类数为10^m
代码:
class Solution {
public:
vector<int> ans;
void cou(int x){//将数转为数组
if(x<10){
ans.emplace_back(x);
return ;
}
cou(x/10);
ans.emplace_back(x%10);
}
int countDigitOne(int n) {
int res=0,atm=0;
cou(n);
int len=ans.size();
for(int i=0;i<len;i++){
int t=i+1;
res+=(atm*pow(10,(len-t)));
atm=atm*10+ans[i];
if(ans[i]>1){
res+=pow(10,len-t);
}
else if(ans[i]==1){
res+=n-atm*pow(10,len-t)+1;
}
}
return res;
}
};
以上是关于Leetcode每日一题-2021-8-13<数字 1 的个数;(规律)的主要内容,如果未能解决你的问题,请参考以下文章