【刷力扣】练习JAVA 九(233. 数字 1 的个数)

!!!!!【此文章仅仅用于记录自己做题,文章毫无用处⚆_⚆】

困难

目录

题目描述:

解题分析(计数类模拟)

代码:


题目描述:

       

 

解题分析(计数类模拟)

一道经典的【数位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;
 }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值