算法—2,记一个自己的算法题 计算数字k在0到n中的出现的次数,k可能是0~9的一个值
3 計算數字k在0到n中的出現的次數,k可能是0~9的一個值
例如n=12,k=1,在 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],我們發現1出現了5次 (1, 10, 11, 12)
AC
int countDigitOne(int n, int k) {if (n<10 &&k==0) {return 1;}int sum =0;int level = 1;while(n / level != 0){if (k == 0 && n / (level * 10) == 0) {// 最高位不能為0break;}int cur = (n/level) %10;//計算當前位int bef = n/(10*level);//計算當前位高位int aft = n - n/level *level;//計算當前位的低位if (cur >k) {sum += (bef+1)*level;}else if (cur <k) {sum += (bef)*level;}else{sum += (bef)*level +aft+1;}level*= 10;}return sum; }這道算法題其實算不上難,但是我的思路卻一直限制了我,走了一些彎路,實在不應該。
首先看這道算法題,計算出現的次數,我們可以看一個例子來理解這道題。
如123中出現的2的次數。
首先123中出現了多少次2,我們可以這么想,個位有多少個2,十位有多少個2,百位有多少2。
1,個位有多少2呢?因為3是大于2的,所以2 12 22 32 42…122一共有12 +1 個,我們可以想象,如果個位的3小于2,那么就只有12個了,最后一個12X上不會有。如果等于呢 則也是12+1。
2,十位有多少2呢? 因為2 ==2 ,所以 21 22 23 24 25…29 120 121 122,這里可以看出來加入十位大于2的時候,則會有 20個,如果小于2,則10個,如果等于,則是10 + 個位+1 (因為個位是2,而計數從0開始 ,如這里加的這個1是120這個)
這里我們可以進行總結:
如果 當前位大于k,則 (高位+1)乘 當前的計數級別(個位為1,十位為10,百位為百)
如果當前位小于k, 則 為高位 乘 當前的計數級別。
如果等于,則為 高位數 乘 當前計數級別 + 低位數+1。
這里的難點就只剩下怎么計算這個當前位,怎么計算當前位的高位,怎么計算當前位的低位。
例如123 ,如果要計算十位的高位,低位,當前位。
當前位:123/10(計數級別) %10(固定10) = 12%10 = 2
高位: 123/(10(固定10) * 10(計數級別))
低位: 123 - 123/10(計數級別)*10(計數級別)
整理一下就是:
int cur = (n/level) %10;//計算當前位int bef = n/(10*level);//計算當前位高位int aft = n - n/level *level;//計算當前位的低位 與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的算法—2,记一个自己的算法题 计算数字k在0到n中的出现的次数,k可能是0~9的一个值的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 字符串 四舍五入保留精度CA
- 下一篇: java1.8中的时间处理类