演算法 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;
}
};
相關文章
- 從面試題中學演算法(2)---求陣列中唯一n個出現1次的數字(n=1,2,3)面試題演算法陣列
- 【Algorithm】《劍指offer》面試題32----從1到n整數中1出現的次數Go面試題
- 【演算法詳解】列印1到最大的n位數演算法
- ACM n-1位數ACM
- 生成{1,2,...,n}的排列的演算法-組合數學演算法
- 演算法中的O(1), O(n),O(logn), O(nlogn)演算法
- 非1~2^n數列的自然數密碼《一》密碼
- 非1~2^n數列的自然數密碼《一A》密碼
- 非1~2^n數列的自然數密碼《二》密碼
- 非1~2^n數列的自然數密碼《二A》密碼
- Dynamics CRM實體系列之1:N、N:1以及N:N關係
- 查詢數N二進位制中1的個數(JS版 和 Java版)JSJava
- 『非1~2^n的互換機制』(中)
- 非1~2^n數列的自然數密碼《一B》密碼
- 非1~2^n數列的自然數密碼《一C》密碼
- 非1~2^n數列的自然數密碼《二B》密碼
- 非1~2^n數列的自然數密碼《二C》密碼
- 非1~2^n數列的自然數密碼《二D》密碼
- 非1~2^n數列的自然數密碼《二E》密碼
- L1-009 N個數求和
- 按字典序生成{1,2,...,n}的r子集的演算法-組合數學演算法
- (演算法)求1到1億間的質數或素數演算法
- 【刷演算法】二進位制中1的個數演算法
- 演算法訓練 - 調和數列問題 輸入一個實數x,求最小的n使得,1/2+1/3+1/4+...+1/(n+1)>=x。 輸入的實數x保證大於等於0.01,小於等於5.20,並且恰好有兩位小數。你的演算法
- 計算2的N次冪n 可輸入,n為自然數
- 用q實現篩法求1-n的質數
- 出現k次與出現1次《演算法很美》演算法
- 【Codeforces Round 362 (Div 2)E】【公式推導+快速冪+費馬小定理】PLEASE a[i]=(1-a[i-1])除2下n次項 n為連乘數公式
- 斐波那契數列的第N項(1≤n≤10^18 矩陣快速冪)矩陣
- 尋找將1~N的整數隨機排列的高效方法隨機
- 編寫程式實現 f(n)=f(n-1)+f(n-2) (f(1)=1 和 f(2)=2 )函式。函式
- SciTech-Mathmatics-Analysis-Infinite Series+Limit: 無窮級數+極限:$large e = lim{(1+frac{1}{n})^n}MIT
- 【劍指offer】陣列中只出現一次的數字(1)陣列
- 以反射Gray碼的順序生成0,1的n元組的演算法-組合數學反射演算法
- 請教cmp關聯的問題,1:1,1:n多關係
- 劍指offer面試題12 列印1到最大的n位數面試題
- 關於求解不定方程的n(n-1)=2m(m-1)的解法的總結
- L1-050 倒數第N個字串 (15分)字串