輸入乙個整數n,求從1到n這n個整數的十進位制表示中1出現的次數。例如輸入12,從1到12這些整數中包含1的數字有1,10,11和12,1一共出現了5次。
考慮將n的十進位制的每一位單獨拿出討論,每一位的值記為weight。
從1到n,每增加1,weight就會加1,當weight加到9時,再加1又會回到0重新開始。那麼weight從0-9的這種週期會出現多少次呢?這取決於n的高位是多少,看圖:
以534為例,在從1增長到n的過程中,534的個位從0-9變化了53次,記為round。每一輪變化中,1在個位出現一次,所以一共出現了53次。
再來看weight的值。weight為4,大於0,說明第54輪變化是從0-4,1又出現了1次。我們記1出現的次數為count,所以:
count = round+1 = 53 + 1 = 54
如果此時weight為0(n=530),說明第54輪到0就停止了,那麼:
count = round = 53
對於10位來說,其0-9週期的出現次數與個位的統計方式是相同的,見圖:
不同點在於:從1到n,每增加10,十位的weight才會增加1,所以,一輪0-9週期內,1會出現10次。即rount*10。
再來看weight的值。當此時weight為3,大於1,說明第6輪出現了10次1,則:
count = round*10+10 = 5*10+10 = 60
如果此時weight的值等於0(n=504),說明第6輪到0就停止了,所以:
count = round*10+10 = 5*10 = 50
如果此時weight的值等於1(n=514)
,那麼第6輪中1出現了多少次呢?很明顯,這與
個位數的值有關,個位數為k,第6輪中1就出現了k+1次(0-k)。
我們記個位數為former,則:
count = round*10+former +1= 5*10+4 = 55
更高位的計算方式其實與十位是一致的,不再闡述。
將n的各個位分為兩類:個位與其它位。
對個位來說:
對其它位來說,記每一位的權值為base,位值為weight,該位之前的數是former,舉例如圖:
則:比如:
public int count(int n)
return count;
}
1 n整數中1出現的次數
示例 1 輸入 n 12 輸出 5 示例 2 輸入 n 13 輸出 62.1 思路分析 題目要求1 n中1出現的次數,考慮將n轉換為字串,然後統計字元1的個數,但這樣會超時 既然1不行,換一種思路,將n轉換為字串後,可以容易確定n的位數 利用for迴圈,從個位開始直到最高位,計算每一位上1出現的次數...
1 n 整數中1出現的次數(21)
方法一 將每個數字中的1的個數進行相加,最終的結果就是1出現的總的次數。但是這種方法的效率較低,時間複雜度為 o n log n o n log n o n lo gn 當n非常大的時候,需要大量的計算。class solution return sumofone int numofone int ...
求1 n整數中1出現的次數
自己不會,看看大神的解法,自己總結一下下,有更好的思路,望指教!解題思路 將數字進行拆分,分為三部分,高位,低位,和當前位 以求十位出現1的次數為例,digit 10 1.以n 1202為例,此時,高位high 12,低位low 2,當前位cur 0 此時十位出現1 的數字的範圍是 0010 111...