討論區很好的乙個思路,分析數字規律,研究明白再記錄一下
牛客題目描述
求出1~13的整數中1出現的次數,並算出100~1300的整數中1出現的次數?為此他特別數了一下1~13中包含1的數字有1、10、11、12、13因此共出現6次,但是對於後面問題他就沒轍了。acmer希望你們幫幫他,並把問題更加普遍化,可以很快的求出任意非負整數區間中1出現的次數(從1 到 n 中1出現的次數)。
分析規律
這個方法是分別分析數字n的每一位(個位、十位、百位…)對應1的個數,最後相加得到最終結果
首先通過i將n分為兩部分,高位和低位:
high = n / i
low = n % i
其中i從1開始(對應個位),每次乘以10(對應十位、百位…),也就實現了分別對個位、十位、百位…的分析,例如n = 12345時:
ihigh
low1
12345010
1234
5100
12345
為什麼要分為兩部分,因為分析當前位1的個數時受高位和低位影響,怎麼影響,接著往下看
以十位(十位對應i = 10)為例分析(每個位規律相同,只是i十倍變化),分為三種情況:十位數字為0、十位數字為1、十位數字大於1(也就是2~9)
1)十位數字為0時,只受當前位的高位數字(百位以上,包括百位)影響
假設n = 12305,則high = 1230,low = 5,十位上有1出現的數字包括:10 ~ 19、110 ~ 119、210 ~219、… 、12210 ~ 12219,一共1230次,1230 = 高位數字(注意這個高位不包括當前的十位,而high包括當前的十位i,所以這個高位=high/10)乘以當前位(i=10) = (high / 10)i = 1230/1010=1230次
2)十位數字為1時,受高位和低位影響
假設n= 12315,high = 1231,low = 5,十位上有1出現的數字包括:10 ~ 19、110 ~ 119、210 ~219、… 、12210 ~ 12219、12310 ~12315,一共1236次,比上一種情況多出了low+1=6次,這就是受低位影響,1236 = 高位數字乘以當前位i再加上低位數字加一 = (high / 10)i + (low+1)= 1230/1010 + (5+1)=1236次
3)十位數字大於1時,只受高位影響,但是和第一種情況略有不同
假設n = 12345,high = 1234,low = 5,十位上有1出現的數字包括:10 ~ 19、110 ~ 119、210 ~219、… 、12210 ~ 12219、12310 ~ 12319,一共1240次,比第一種情況多出了i=10次,1240 = 高位數字加一再乘以i = (high / 10 + 1)*i = (1230/10 +1)*10 = 1240次
以上就是對十位上1出現次數的三種情況分析,其他各位只是i不同
最後還有乙個改進的技巧,就是計算高位數字時,(1)和(2)中的計算方式是 (high / 10)*i,此時十位數字是0或1,例如12305或12315,對應的high是1230或1231,對這兩個數字除以10和將這兩個數字加8之後再除以10結果是一樣的(結果不包含餘數),就是1230/10 = 1238/10 = 123、1231/10 = 1239/10 = 123,所以 (high / 10)*i可以改進為 ((high+8)) / 10)*i;在(3)中計算方式是(high / 10 + 1)*i,此時如果也將high加8再算,如12345,high = 1234,1234+8=1242(也就是進了一位),1242/10 = 1234/10+1 = 124,也就是說(3)的計算方式也可以寫為 ((high+8)) / 10)*i,這樣三種情況的計算方式都統一了,寫**時也簡潔
**
class solution:
def numberof1between1andn_solution(self, n):
# write code here
count = 0
i = 1
while i <= n:
high = n / i
low = n % i
count += (high + 8) / 10 * i + (high % 10 == 1) * (low + 1)
i *= 10
return count
劍指offer 整數中1出現的次數
求出1 13的整數中1出現的次數,並算出100 1300的整數中1出現的次數?為此他特別數了一下1 13中包含1的數字有1 10 11 12 13因此共出現6次,但是對於後面問題他就沒轍了。acmer希望你們幫幫他,並把問題更加普遍化,可以很快的求出任意非負整數區間中1出現的次數。這是劍指offer...
整數中1出現的次數(劍指offer)
求出1 13的整數中1出現的次數,並算出100 1300的整數中1出現的次數?為此他特別數了一下1 13中包含1的數字有1 10 11 12 13因此共出現6次,但是對於後面問題他就沒轍了。acmer希望你們幫幫他,並把問題更加普遍化,可以很快的求出任意非負整數區間中1出現的次數 從1 到 n 中1...
劍指Offer 整數中1出現的次數
時間限制 1秒 空間限制 32768k 熱度指數 226203 本題知識點 查詢數學 求出1 13的整數中1出現的次數,並算出100 1300的整數中1出現的次數?為此他特別數了一下1 13中包含1的數字有1 10 11 12 13因此共出現6次,但是對於後面問題他就沒轍了。acmer希望你們幫幫他...