LeetCode 233. Number of Digit One

简介: 给定一个整数 n,计算所有小于等于 n 的非负整数中数字 1 出现的个数。

v2-076a5ad467bd4b28a87724ed8b1a1f2e_1440w.jpg

Description



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


Example:

Input: 13

Output: 6


Explanation: Digit 1 occurred in the following numbers: 1, 10, 11, 12, 13.


描述



给定一个整数 n,计算所有小于等于 n 的非负整数中数字 1 出现的个数。


示例:

输入: 13

输出: 6

解释: 数字 1 出现在以下数字中: 1, 10, 11, 12, 13 。


思路



v2-720880cfbf9984f06e20fa81c16a0728_720w.jpg


  • 这道题是找规律的题目.
  • 我们每一位每一位进行运算.
  • 如上图,以百位middle为例:
    1.如果百位为0,则我们另百位为1,个位和十位构成的数字right从0取到99,有100种取法,前面部分的构成的数字从0取到9765,一共有9766中取法,也就是说在给定值的百位为0情况下,小于该数字的所有数字中,百位为1的有9766*100个数字.
    2.如果百位本身为1,那么个位和十位构成的数字right从0取到99,有仍然有100种取法,前面部分的构成的数字从0取到9765,一共有9766中取法,百位本身为1,我们另百位前面所有的数不变,仍然有19(right)种取法,所以在定值的百位为0情况下,小于该数字的所有数字中,百位为1的有9766*100+right个数字.
    3.如果给定的百位数大于1,可以分析得出一共有(right+1)*100种取法.
    4.同理其他情况也一样.


# -*- coding: utf-8 -*-
# @Author:             何睿
# @Create Date:        2019-02-01 12:57:09
# @Last Modified by:   何睿
# @Last Modified time: 2019-02-01 14:28:55
class Solution:
    def countDigitOne(self, n):
        """
        :type n: int
        :rtype: int
        """
        res = 0
        # 如果是负数,直接返回零
        if n <= 0: return res
        # 当前位置左边的所有数,当前位置的值,当前位置右边的值
        left, right, middle, factor = 1, 1, 1, 1
        # 循环条件,当left不为零(即左边还有数的时候)
        while left:
            # 取左边部分
            left = n // (factor * 10)
            # 取当前位置的值
            middle = n // factor % 10
            # 取当前位置右边的值
            right = n % factor
            # 如果当前位置的值为0
            if middle == 0:
                res += left * factor
            # 如果当前的值为1
            elif middle == 1:
                res += left * factor + right + 1
            # 如果当前的值大于等于2
            else:
                res += (left + 1) * factor
            factor *= 10
        # 返回最终的结果
        return res


源代码文件在这里.


目录
相关文章
|
算法
Leetcode 313. Super Ugly Number
题目翻译成中文是『超级丑数』,啥叫丑数?丑数就是素因子只有2,3,5的数,7 14 21不是丑数,因为他们都有7这个素数。 这里的超级丑数只是对丑数的一个扩展,超级丑数的素因子不再仅限于2 3 5,而是由题目给定一个素数数组。与朴素丑数算法相比,只是将素因子变了而已,解法还是和朴素丑数一致的。
99 1
|
5月前
|
存储 SQL 算法
LeetCode 题目 65:有效数字(Valid Number)【python】
LeetCode 题目 65:有效数字(Valid Number)【python】
|
6月前
|
存储 算法
【LeetCode力扣】单调栈解决Next Greater Number(下一个更大值)问题
【LeetCode力扣】单调栈解决Next Greater Number(下一个更大值)问题
44 0
Leetcode 623. Add One Row to Tree
题目很简单,在树的第d层加一层,值为v。递归增加一层就好了。代码如下
46 0
|
存储
Leetcode Single Number II (面试题推荐)
给你一个整数数组,每个元素出现了三次,但只有一个元素出现了一次,让你找出这个数,要求线性的时间复杂度,不使用额外空间。
39 0
LeetCode Contest 178-1368. 使网格图至少有一条有效路径的最小代价 Minimum Cost to Make at Least One Valid Path in a Grid
LeetCode Contest 178-1368. 使网格图至少有一条有效路径的最小代价 Minimum Cost to Make at Least One Valid Path in a Grid
LeetCode contest 190 5417. 定长子串中元音的最大数目 Maximum Number of Vowels in a Substring of Given Length
LeetCode contest 190 5417. 定长子串中元音的最大数目 Maximum Number of Vowels in a Substring of Given Length
LeetCode Contest 178-1365. 有多少小于当前数字的数字 How Many Numbers Are Smaller Than the Current Number
LeetCode Contest 178-1365. 有多少小于当前数字的数字 How Many Numbers Are Smaller Than the Current Number
LeetCode 136. 只出现一次的数字 Single Number
LeetCode 136. 只出现一次的数字 Single Number
|
2月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行