• 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.

    链接: http://leetcode.com/problems/number-of-digit-one/

    题解:

    又是数学题,主要思路是用递归来做。还有一些别的解法,二刷的时候争取理解最优解。

    下面我们来一步步分析:

    1. n < 1时,结果为0
    2. 1 <= n < 10时,结果为1
    3. 假定n = 312,我们把这个计算过程分解为几个步骤:
      1. (1 ~ 99), 结果为 countDigitOne(99)
      2. (100 ~ 199), 结果为 100 + countDigitOne(99)
      3. (200 ~ 299), 结果为countDigitOne(99)
      4. (300 ~ 312), 结果为countDigitOne(12)
    4. 假定n = 112, 我们也把这个计算过程分解一下:
      1. (1 ~ 99), 结果为 countDigitOne(99)
      2. (100 ~ 112), 结果为 112 - 100 + 1 + countDigitOne(12)
    5. 由此我们可以推出通项公式

    Time Complexity  - O(log10n), Space Complexity - O(log10n)

    public class Solution {
        public int countDigitOne(int n) {
            if (n < 1)
                return 0;
            if (n < 10)
                return 1;
            int baseInTen = (int)Math.pow(10, String.valueOf(n).length() - 1);   
            int highestDigit = n / baseInTen;         // get the highest digit of n
            
            if(highestDigit == 1)
                return countDigitOne(baseInTen - 1) + (n - baseInTen + 1) + countDigitOne(n % baseInTen);
            else
                return highestDigit * countDigitOne(baseInTen - 1) + baseInTen + countDigitOne(n % baseInTen);
        }
    }

    Reference:

    https://leetcode.com/discuss/44281/4-lines-o-log-n-c-java-python

    https://leetcode.com/discuss/44279/clean-c-code-of-log10-complexity-with-detailed-explanation

    https://leetcode.com/discuss/44314/accepted-solution-using-counting-principle-with-explanation

    https://leetcode.com/discuss/44465/my-ac-java-solution-with-explanation

    https://leetcode.com/discuss/44617/my-recursion-implementation

    https://leetcode.com/discuss/47774/0ms-recursive-solution-in-c-8-line-code

    https://leetcode.com/discuss/46366/ac-short-java-solution

    https://leetcode.com/discuss/64604/my-simple-and-understandable-java-solution

    https://leetcode.com/discuss/64962/java-python-one-pass-solution-easy-to-understand

    https://leetcode.com/discuss/54107/0-ms-recursive-solution

    https://leetcode.com/discuss/58868/easy-understand-java-solution-with-detailed-explaination

  • 相关阅读:
    同时实现同时只允许一个人登录系统 dodo
    比较C#中的readonly与const (转) dodo
    iframe,Frame中关于Session丢失的解决方法 dodo
    sqlserver数据库同步解决方案 dodo
    利用C#调用WINRAR实现压缩与解压 dodo
    .net打包自动安装数据库 dodo
    关于sqlserver packet size dodo
    真正生成高质量不变形缩略图片 dodo
    Datagrid列表控件使用 dodo
    NUnit学习之VS.net 2005篇(转) dodo
  • 原文地址:https://www.cnblogs.com/yrbbest/p/5002299.html
Copyright © 2020-2023  润新知