• Leetcode 233. Number of Digit One


    Given an integer n, count the total number of digit 1 appearing in all non-negative integers less than or equal to n.

    For example:
    Given n = 13,
    Return 6, because digit 1 occurred in the following numbers: 1, 10, 11, 12, 13.

    题目分析

    1、我们将每个数以位数进行分类,首先计算每一位可以出现多少个一,(一个三位数,我们先计算个位上1出现的次数,然后计算十位上1出现的次数,最后计算百位上1出现的次数)然后进行累加,得到小于n的数出现1的次数之和。

    2、将某位上的数字按大小不同进行分类,分析出不同的计算方法

    例子:

    以算百位上1为例子:   假设百位上是0, 1, 和 >=2 三种情况: 

        case 1: n=3141092, a= 31410, b=92. 计算百位上1的个数应该为 3141 *100 次.

        case 2: n=3141192, a= 31411, b=92. 计算百位上1的个数应该为 3141 *100 + (92+1) 次. 

        case 3: n=3141592, a= 31415, b=92. 计算百位上1的个数应该为 (3141+1) *100 次. 

    以上三种情况可以用 一个公式概括:

    (a + 8) / 10 * m + (a % 10 == 1) * (b + 1);
     1 class Solution {
     2 public:
     3     int countDigitOne(int n) {
     4         vector<int> nFamily;  
     5         vector<int> digits;
     6         int sum = 0;
     7         while(n/10){
     8             int temp = n%10;
     9             digits.push_back(temp);
    10             n = n/10;
    11             nFamily.push_back(n);
    12         }
    13         digits.push_back(n);
    14         nFamily.push_back(0);
    15         for(int i = 0;i<digits.size();i++){
    16             if(digits[i]==0){
    17                 int addZero = 1;
    18                 for(int j = i-1;j>=0;j--){
    19                     addZero = addZero*10;
    20                 }
    21                 sum+=nFamily[i]*addZero;
    22             }
    23             if(digits[i]==1){
    24                 int addNum = 0;
    25                 int addZero = 1;
    26                 for(int j = i-1;j >= 0;j--){
    27                     addNum = addNum*10 + digits[j]; 
    28                     addZero = addZero*10;
    29                 }
    30                 sum+=nFamily[i]*addZero+(addNum+1);
    31             }
    32             if(digits[i]>1){
    33                  int addZero =1;
    34                  for(int j = i-1;j>=0;j--){
    35                     addZero = addZero*10;
    36                 }
    37                 sum+=(nFamily[i]+1)*addZero;
    38             }
    39         }
    40         return sum;
    41     }
    42 };
     
  • 相关阅读:
    【MySQL 5.7 Reference Manual】15.4.2 Change Buffer(变更缓冲)
    从MySQL slave system lock延迟说开去
    一文搞懂Raft算法
    Relinking Oracle Home FAQ ( Frequently Asked Questions) (Doc ID 1467060.1)
    Oracle 单实例 Relink Binary Options 说明
    oracle upgrade best pratics
    sysbench安装、使用、结果解读
    Linux 进程管理之四大名捕
    iOS 严重问题解释(crash)
    iOS 图片剪切和压缩的几个方法
  • 原文地址:https://www.cnblogs.com/timesdaughter/p/5330474.html
Copyright © 2020-2023  润新知