!!!!!【此文章仅仅用于记录自己做题,文章毫无用处⚆_⚆】
【困难】
目录
题目描述:
解题分析(计数类模拟)
一道经典的【数位DP】模板题简化版
简单来说就是,统计1在每个位置上出现的次数,累加起来即使所求。
分类讨论:
例举abcdefg,假设现在c位置
1》当c前面部分<ab,满足大小要求,后面部分任意取,则根据【乘法原理】,可得知数量有ab*100;
2》当c前面部分=ab时,大小关系主要取决于C
当c=0时,数量为0;
当c=1时,大小关系取决于后面,后面数量有defg*10000,则总共=defg+1;
当c>1时,后面任意,10000;
3》当c前面部分>ab时,必然不满足,数量为0.
代码:
class Solution {
public int countDigitOne(int n) {
int ans=0;//记录总数
String s=String.valueOf(n);
int m=s.length();
if(m==1)
if(n>=1)return 1;
else return 0;
int []ps =new int [m],ss=new int [m];//分别记录每位前后缀
for(int i=1;i<m-1;i++)//要从1开始
{
ps[i]=Integer.parseInt(s.substring(0,i));
ss[i]=Integer.parseInt(s.substring(i+1));
}
ps[m-1]=Integer.parseInt(s.substring(0,m-1));
//int tot=0;
ss[0] = Integer.parseInt(s.substring(1));//要加上
for(int i=0;i<m;i++)
{
int tot=0;
int pre=ps[i],bre=ss[i],len=m-i-1;
tot+=pre*Math.pow(10,len);
int x=s.charAt(i)-'0';
if(x==0){}
else if(x==1)
tot+=bre+1;
else if(x>1)
{
tot += Math.pow(10, len);
}
ans+=tot;
}
return ans;
}
}