演算法 1~n中1的次數
輸入一個整數 n ,求1~n這n個整數的十進位制表示中1出現的次數。
例如,輸入12,1~12這些整數中包含1 的數字有1、10、11和12,1一共出現了5次。
示例 1:
輸入:n = 12
輸出:5
示例 2:
輸入:n = 13
輸出:6
原題出處:https://leetcode-cn.com/problems/number-of-digit-one/
演算法1:把每個數字中包含1的數量計算出來,然後把1~n的1的數量全部加起來(效率低)
int NembOf1(int n)
{
int ans = 0;
while (n)
{
if (n % 10 == 1)
ans++;
n /= 10;
}
return ans;
}
int NembOf1BetweenN(int n)
{
int ans = 0;
for (int i = 1;i <= n;i++)
{
ans += NembOf1(i);
}
return ans;
}
演算法2:看見他人分享的https://leetcode-cn.com/problems/number-of-digit-one/solution/c-kan-dao-bie-ren-fen-xiang-de-by-coke-10/.
程式設計之美上給出的規律: 1.如果第i位(自右至左,從1開始標號)上的數字為0,則第i位可能出現1的次數由更高位決定(若沒有高位,視高位為0),等於更高位數字X當前位數的權重10^(i-1)。 2.如果第i位上的數字為1,則第i位上可能出現1的次數不僅受更高位影響,還受低位影響(若沒有低位,視低位為0),等於更高位數字X當前位數的權重10^(i-1)+(低位數字+1)。 3.如果第i位上的數字大於1,則第i位上可能出現1的次數僅由更高位決定(若沒有高位,視高位為0),等於(更高位數字+1)X當前位數的權重10^(i-1)。
通用結論:
從 1 至 10,在它們的個位數中,任意的 X 都出現了 1 次
從 1 至 100,在它們的十位數中,任意的 X 都出現了 10 次
從 1 至 1000,在它們的千位數中,任意的 X 都出現了 100 次
依此類推,從 1 至 10^i,在它們的左數第二位(右數第 i 位)中,任意的 X 都出現了10^(i−1) 次
得出的演算法如下:
當計算右數第 i 位包含的 X 的個數時:
取第 i 位左邊(高位)的數字,乘以 10^(i−1),得到基礎值 a
取第 i 位數字,計算修正值:
如果大於 X,則結果為 a+10^(i−1)
如果小於 X,則結果為 a
如果等 X,則取第 i 位右邊(低位)數字,設為 b,最後結果為 a+b+1
class Solution {
public:
int countDigitOne(int n) {
if(n<1) return 0;
int res=0,digit=1;
int right=0,now,left;
while(n){
now=n%10;
left=n/10;
if(now<1){
res+=left*pow(10,digit-1);
}
else if(now==1){
res+=left*pow(10,digit-1)+right+1;
}
else{
res+=(left+1)*pow(10,digit-1);
}
right+=pow(10,digit-1)*now;
digit++;
n/=10;
}
return res;
}
};
相關文章
- JZ-031-從 1 到 n 整數中 1 出現的次數
- 【Algorithm】《劍指offer》面試題32----從1到n整數中1出現的次數Go面試題
- 2022-07-17:1、2、3...n-1、n、n、n+1、n+2... 在這個序列中,只有一個數字有重複(n)。 這
- 演算法中的O(1), O(n),O(logn), O(nlogn)演算法
- 一個未知數的一元2n+1次方
- 1~7的謎題(1):n=1
- 每日一練(25): 0~n-1中缺失的數字
- 給定一個n,輸出從1到n的整數
- L1-009 N個數求和
- Dynamics CRM實體系列之1:N、N:1以及N:N關係
- PAT-L1-009 N個數求和
- 劍指 Offer 53 - II. 0~n-1中缺失的數字(二分法)1
- 【刷演算法】二進位制中1的個數演算法
- JZ-068-列印從 1 到最大的 n 位數
- 演算法訓練 - 調和數列問題 輸入一個實數x,求最小的n使得,1/2+1/3+1/4+...+1/(n+1)>=x。 輸入的實數x保證大於等於0.01,小於等於5.20,並且恰好有兩位小數。你的演算法
- Numerical Results of T3DFP-N1 and irT3DFP-N13D
- zcmu1074: 求1+1/2+1/3+...+1/n
- 在【】1【】2【】3【】4【】5【】6【】7【】8【】9的方格中填上“+”“-”,如果可以使其代數和為n,就稱數n是“可被表出的數“,比如1是可被表出的數,因為+1+2-3-4+5+6-7-8+9
- 計算2的N次冪n 可輸入,n為自然數
- 編寫程式實現 f(n)=f(n-1)+f(n-2) (f(1)=1 和 f(2)=2 )函式。函式
- 出現k次與出現1次《演算法很美》演算法
- 連結串列-3n+1數列問題
- SciTech-Mathmatics-Analysis-Infinite Series+Limit: 無窮級數+極限:$large e = lim{(1+frac{1}{n})^n}MIT
- 1N5819-ASEMI軸向肖特基二極體1N5819
- N1, T1刷機記錄
- 【劍指 Offer 】17. 列印從1到最大的n位數
- 劍指offer | 17. 列印從1到最大的n位數
- L1-050 倒數第N個字串 (15分)字串
- 力扣.1 兩數之和 N 種解法 two-sum力扣
- N5_201212_Q1
- BUU_ciscn_2019_n_1
- 數字中的1——leetcode233LeetCode
- [演算法] LeetCode 1.兩數之和演算法LeetCode
- 1.迭代次數對精確度的影響
- 演算法中級學習1演算法
- offer通過--12列印1到最大的n的的位數-2
- 劍指 Offer 列印從1到最大n位數c++C++
- 11.2.0.3 :PRVG-11134 : Interface "n.n.n.n" on node "racnode1" is not able to..