zoukankan      html  css  js  c++  java
  • 整数中1出现的次数

    题目

    求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。

     1 # -*- coding:utf-8 -*-
     2 class Solution:
     3     def NumberOf1Between1AndN_Solution(self, n):
     4         if n<0:
     5             return 0
     6         # 将n转换为字符串
     7         strn = str(n)
     8         return self.NumberOf1Between1(strn)
     9 
    10     def NumberOf1Between1(self,strn):
    11         # 注意,strn为空时
    12         if len(strn)==0:
    13             return 0
    14         first = int(strn[0])
    15         # 字符串长度只有一位
    16         if len(strn)==1 and first==0:
    17             return 0
    18         if len(strn)==1 and first>0:
    19             return 1
    20         # 处理最高位
    21         numFirstDigit=0
    22         if first==1:
    23             numFirstDigit = int(strn[1:])+1 # eg:12345, 最高位是1,10000到12345中最高位是1的总数为2346
    24         if first>1:
    25             numFirstDigit= self.PowerBase(len(strn)-1) # 例如:21345,最高位是2时,此时10000到21345,最高位是1的有10000个,10的4次方
    26         #1在其他位
    27         numOther = first*(len(strn)-1)*self.PowerBase(len(strn)-2) # 除去最高位,有一位为1,其他0-9,10种选择,排列组合
    28         
    29         numrec = self.NumberOf1Between1(strn[1:])
    30         return numFirstDigit+numOther+numrec
    31     def PowerBase(self,length):
    32         return pow(10,length)
  • 相关阅读:
    [CQOI2005]三角形面积并(计算几何+扫描线)
    第一天
    LA3026 周期 (kmp)
    HDU 1715 大菲波数 (java大数)
    根据身高重建队列(vector)
    K 连续位的最小翻转次数
    724. Find Pivot Index
    Two Sum
    c
    Most Powerful(状压DP水题)
  • 原文地址:https://www.cnblogs.com/shuangcao/p/12769481.html
Copyright © 2011-2022 走看看