zoukankan      html  css  js  c++  java
  • 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 };
     
  • 相关阅读:
    按钮-全选复选框 PENGHAO
    ASP.NET技术内幕的电子书中文版 PENGHAO
    hotmail和gmail 邮件中背景图片无效不显示的解决办法
    Silverlight之DataGrid的列格式化日期
    MS SQL基础
    JS获得当前地址栏url
    Javascript实现复制到剪贴板
    C#.NET画验证码与Cookie验证
    网站部署与定制
    操作SQL数据库常用语句
  • 原文地址:https://www.cnblogs.com/timesdaughter/p/5330474.html
Copyright © 2011-2022 走看看