数-031-アルゴリズム1は、他の整数に現れる(Nの発生数が1から1の整数です)

記事のディレクトリ

タイトル説明

算出した1~131が登場整数の数、および計算100~1300回数1が表示されますの整数を?特に、彼はこの目的のためにカウントすると、1~13番号1は1,10,11,12,13したがって、6回の合計を表示されますが、彼Meizhe後ろの問題のために持っている含まれていました。ACMerは、範囲内の負でない整数の数1が表示され、あなたは彼を助けることを願っていますし、問題がより一般化された(1からnまでの発生回数。1)迅速いずれかを見つけることができます。

分析

  • 方法:単一数に含まれたレコードの数は、一緒に追加します。時間複雑> O(N)、空間的複雑度はO(N)です。
  • 方法2:誘導:
    • 1-10からは、その一桁で、Xのいずれかが一度浮上しています。
    • その数十で、1-100から、任意のX-登場10回。
    • 1-1000からは、彼らの数百の位で、Xのいずれかが100回登場しました。

ように、1からの 1 0 i 10 ^ {I} 、第2ビット(右からiビット)は、任意のX浮上している、その数に残っ 1 0 i 1 10 ^ {I-1} 次。

  • Iに含まれる1ビットの数を計算する際に上記のアルゴリズムを要約すると、それは右から見ることができます。

    • 私は左(高い)のビット数を取ることで乗算 1 0 i 1 10 ^ {I-1} 、ベース値aを得ました。
    • i番目の桁を取り、補正値が計算されます。
      • 1より大きい場合、結果は+です 1 0 i 1 10 ^ {I-1}
      • 結果は、1未満です。
      • 1に等しい場合、最終結果は、+ B + 1であり、bは、i番目のビット(LSB)デジタルの右側を取ります。
  • 時間の複雑さO(n的位数)、スペースの複雑さO(n)

举例说明

N = 2593の隣に、X = 5N = 2593、X = 5数式を取得する方法を説明するための一例として。1から2593年に、数5が0で百、千倍のビット259倍、10で260回、294回など、813時間の合計が表示されます。

今、何よりもまず、ビットをこれらのデータを分析するためです。2590から1から、10 259が含まれているので、任意の259 Xが出現しています。最後に残った3つの数字2591年、2592年と2593年、なぜなら彼らの最大桁3 <X、それは任意の5が含まれません。

その後、10。1から2500は、25 100を含み、従って任意のX 25×10 = 25025×10 = 250回出現しています。残りの数字は、このように、すべての10 5を含む、2501年から2593年に10桁9> Xのその最大値です。最後に、250 + 10 = 260の合計。

百続きます。1から2000年まで、それはこのように任意のX 2×100 = 2002×100 = 200回出現してきた、2 1000が含まれています。残りの図は、2001年から2593年からある彼らの最大の百デジタル5 == X、その後、状況は少し複雑になり、彼らは百5に含まれなければならないが、100のすべてが含まれていません。百桁5を2500〜2593に、表示されている場合、110桁に関連付けられた桁数は、93 + 1 = 94です。最後に、200 + 94 = 294の合計。

最後に、千。今は高い位置は、それがどんな5は含まれませんので、このように直接、最大千図2 <Xを参照して、そこにあります。これまでのところ、すべての数5の出現回数を計算しています。

コード

  • この方法の一つ:
# -*- coding:utf-8 -*-
class Solution:
    def NumberOf1Between1AndN_Solution(self, n):
        # write code here
        counter = 0
        for i in range(n+1):
            counter += self.has1Counter(i)
        
        return counter
    
    def has1Counter(self, number):
        counter = 0
        while number:
            if number%10==1:
                counter += 1
            number //= 10
        return counter
  • 方法2:
# -*- coding:utf-8 -*-
class Solution:
    def NumberOf1Between1AndN_Solution(self, n):
        # write code here
        counter = 0
        for i in range(1,len(str(n))+1):
            high = n//(10**i)  # 高位数字
            low = n%(10**(i-1)) # 低位数字
            now = n//10**(i-1)%10 # 当前位
            
            if now<1:
                counter += high * 10**(i-1)
            elif now>1:
                counter += high *10**(i-1) + 10**(i-1)
            else:
                counter += high*10**(i-1) + low + 1
            
        return counter
发布了219 篇原创文章 · 获赞 85 · 访问量 14万+

おすすめ

転載: blog.csdn.net/z_feng12489/article/details/103478837