1 n中1出現的次數

2021-10-07 19:02:43 字數 1294 閱讀 3884

輸入乙個整數 n ,求1~n這n個整數的十進位制表示中1出現的次數。

例如,輸入12,1~12這些整數中包含1 的數字有1、10、11和12,1一共出現了5次。

示例 1:

輸入:n = 12

輸出:5

示例 2:

輸入:n = 13

輸出:6

解析需要通過找規律來分析。

假設我們對5014這個數字求解。

(1)個位上1出現的個數:記高位為high=501,當前位為cur=4。

那麼高位從0~500變化的過程中,每乙個變化中1只出現1次,即(高位1)這樣的數字;

高位是501時,因為當前位是4,所以1只能出現一次,即5011。

所以總共出現的次數為high*1+1=502。

(2)十位1出現的個數:記高位high=50,當前位為cur=1,低位為low=4。

那麼高位從0~ 49變化的過程中,每乙個變化中1出現10次,即(高位10)~(高位19)這樣的數字;

高位為50的時候,因為當前位是1,所以我們要看低位來決定出現的次數,因為低位為4,所以此時出現5次,即5010~5014這樣的數字。

所以總共出現的次數為high*10+4+1=505。

(3)百位1出現的個數:記高位high=5,當前位cur=0,低位為low=14。

那麼高位從0~ 4的過程中,每乙個變化1出現100次,即(高位100)~(高位199)這樣的數字;

高位為5的時候,因為當前位為0,所以不存在出現1的可能性。

所以總共出現的次數為high*100=500。

(4)千位1出現的次數:記高位high=0,當前位cur=5,低位low=014。

那麼因為沒有高位所以直接看當前位,因為當前位為5,所以1出現的次數為1000,即1000~1999這樣的數字。

所以總共出現的次數為high*1000+1000=1000。

綜上,最終的結果將每個位置出現1的次數累加即可。

結論我們假設高位為high,當前位為cur,低位為low,i代表著需要統計的位置數(1對應個位,10對應十位,100對應百位),則對每一位的個數count有:

cur=0,count = high*i;

cur=1,count=high*i+low+1;

cur>1,count=high*i+i

最終累加所有位置上的個數即最終答案。

class solution  else if(cur == 1) else 

i = i * 10;//準備遍歷下一位

}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...