Leetcode 233 Number of Digit One

原创 2015年07月08日 11:30:38

1. 问题描述

  给定一个整数n,在所有不大于n的非负整数中,计算包含数字1的整数的个数。例如n=13的结果为6,包含1的数字有1,10,11,12,13。


2. 方法与思路

  这个问题最直观的方法就是累加1到n所有的包含1的数的个数。每个数通过循环取余10的方法判断是否包含1。但是这种思路效率并不高,数字n有logn位,总得时间复杂度为O(nlogn)
  利用数字的规律,简化计算。以数字21567为例。先将数字分为两段:“1到1567”和“1568到21567”。
  从1568到21567这段,分为两种情况,1出现在最高位的情况。从10000到19999的数字中,包含1的一共出现了104个,但对于数字12345,1出现在10000到12345的万位的个数就是2345+1=2346次。再看1出现在从1568到21567后4位的情况。同样分成两段,1568到11568和11569到21568,每一段剩下的4位书中,设其中一位是1,其他三位可以是0~9之间的数,根据排列组合原理处理即可。
  至于从1到1567利用递归就可以了。
  

class Solution {
private:
    int numofOne(int n)
    {
        if(n == 0) return 0;
        if(n > 0 && n < 10) return 1;

        int a = n,cnt = 0,num1,num2,num3;

        while(a/10)
        {
            a /=10;
            cnt++;
        }

        if(a > 1)
            num1 = pow(10,cnt);
        else if(a == 1)
            num1 = n%(int)pow(10,cnt)+1;

        num2 = a * (cnt)*pow(10,cnt-1);
        num3 = numofOne(n%(int)pow(10,cnt));

        return num1+num2+num3;

    }
public:
    int countDigitOne(int n) {
        return numofOne(n);
    }
};

[LeetCode]575. Distribute Candies(妹妹最多能得到多少种糖果)

575. Distribute Candies原题链接 Given an integer array with even length, where different numbers in thi...
  • whl_program
  • whl_program
  • 2017年05月07日 20:28
  • 2288

leetcode 204题求素数个数

Description: Count the number of prime numbers less than a non-negative number, n   提示晒数法: http://e...
  • wangyaninglm
  • wangyaninglm
  • 2015年04月28日 22:20
  • 2118

LeetCodet题解--17. Letter Combinations of a Phone Number(所有数字键盘组合所对应的所有字符集合)

链接 LeetCode题目:https://leetcode.com/problems/letter-combinations-of-a-phone-number/ GitHub代码:h...
  • gatieme
  • gatieme
  • 2016年04月07日 16:53
  • 1541

LeetCode Algorithms 233. Number of Digit One 题解

题目:Given an integer n, count the total number of digit 1 appearing in all non-negative integers less...
  • qq_22652929
  • qq_22652929
  • 2017年06月05日 13:20
  • 137

算法Week02.04 - LeetCode 233. Number of Digit One

算法Week02.04 - LeetCode 233. Number of Digit One
  • lukeluocn
  • lukeluocn
  • 2016年09月11日 21:01
  • 186

【LeetCode-233】Number of Digit One

一看到这道题就想到了动态规划,但是tle了,先看看我的python代码吧! class Solution(object): # 最容易想到的方法了(动态规划),但是tle了 def ...
  • cold2wind
  • cold2wind
  • 2016年05月04日 16:39
  • 133

LeetCode 233. Number of Digit One

原题网址:https://leetcode.com/problems/number-of-digit-one/ Given an integer n, count the total number...
  • jmspan
  • jmspan
  • 2016年04月06日 04:10
  • 272

leetcode 233: Number of Digit One

Given an integer n, count the total number of digit 1 appearing in all non-negative integers less th...
  • tingting256
  • tingting256
  • 2015年10月29日 16:17
  • 257

LeetCode-233.Number of Digit One

https://leetcode.com/problems/number-of-digit-one/ Given an integer n, count the total number o...
  • zmq570235977
  • zmq570235977
  • 2016年07月12日 15:54
  • 214

LeetCode No.233 Number of Digit One

LeetCode No.233 Number of Digit One
  • woshihuangjianwei
  • woshihuangjianwei
  • 2016年10月29日 09:16
  • 128
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Leetcode 233 Number of Digit One
举报原因:
原因补充:

(最多只允许输入30个字)