• 剑指offer 43


    想法有了但是没实现出来:

    按位找,从个位到最高位,每一位1个数之和

    具体来讲,分成当前位curr,当前位之前所有位:高位high,以及当前位之后所有位:低位low

    维护一个i,i=1表示当前个位,i=10十位,以此类推

    那么,对于个位上的1,我们首先要看,这个数有多少个10,因为0-9十个数里面有1个1,而high刚好是有多少个10,另外,如果当前也就是个位>1,会多加一个1

    对于十位上的1,我们首先要看有多少个100,因为0-99一共100数字,十位上出现10次1,high刚好是有多少100,当前i=10,那么10个一组,10位出现1成组次数为high*i,但是high中少一部分,如果curr=0,就不少了,因为当前不存在十位上有的情况,如果i=1,那么low中有多少个数字,就有多少加1个新增,因为10位置上的没计算在low中,如果curr>1,那么十位数上的10个都在了,都要加上,加个i

    对于百位,千位等也是一样

    下面是计算high,curr,与low,因为i表示当前是哪位

    high=n/(i*10),也就是前一位做个位,有多少个

    curr=(n/i)%10,因为n/i结果是当前位做个位,之后%10就取出当前位

    low=n-(n/i)*i,n/i当前位个位,*i以后当前位之后所有都是0,n-之后就求出来之后的位数了

    最后到n/i=0,也就是i比最高位高为止

    class Solution {
        public int countDigitOne(int n) {
           long count=0;
          long i=1;
          while(n/i!=0){
              long high=n/(10*i);
              long curr=(n/i)%10;
              long low=n-(n/i)*i;
              if(curr==0){
                 count = count + high * i;
              }else if(curr>1){
                  count = count +high*i+i;
              }else {
                  count=count+high*i+low+1;
              }
              i=i*10;
          }
           
    
            return (int)count;
    
        }
    }
  • 相关阅读:
    sed处理文本文件
    多节点ssh免密匙登录
    nmon监控工具的使用
    PostgreSQL 磁盘使用大小监控
    PostgreSQL 锁监控
    PostgreSQL installations
    《卸甲笔记》-多表查询之二
    《卸甲笔记》-多表查询之一
    《卸甲笔记》-子查询
    《卸甲笔记》-分组统计查询
  • 原文地址:https://www.cnblogs.com/jieyi/p/14309652.html
Copyright © 2020-2023  润新知