タイトル説明
算出した1~13
1が登場整数の数、および計算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からの 、第2ビット(右からiビット)は、任意のX浮上している、その数に残っ 次。
-
Iに含まれる1ビットの数を計算する際に上記のアルゴリズムを要約すると、それは右から見ることができます。
- 私は左(高い)のビット数を取ることで乗算 、ベース値aを得ました。
- 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