劍指offer—整數中1出現的次數
阿新 • • 發佈:2019-02-16
華電北風吹
天津大學認知計算與應用重點實驗室
日期:2015/10/5
題目描述
求出1~13的整數中1出現的次數,並算出100~1300的整數中1出現的次數?為此他特別數了一下1~13中包含1的數字有1、10、11、12、13因此共出現6次,但是對於後面問題他就沒轍了。ACMer希望你們幫幫他,並把問題更加普遍化,可以很快的求出任意非負整數區間中1出現的次數。
解析:最簡單的辦法一個一個數。高階的辦法
一個一個數的數
class Solution {
public:
int NumberOf1Between1AndN_Solution(int n)
{
int result=0;
for(int i=1;i<=n;i++)
result+=count1(i);
return result;
}
int count1(int n)
{
int result=0;
while(n>0)
{
if(n%10==1)
result++;
n=n/10;
}
return result;
}
};
找規律高效演算法
class Solution
{
public:
int NumberOf1Between1AndN_Solution(int n){
int ones = 0;
for (long long m = 1; m <= n; m *= 10)
ones += (n/m + 8) / 10 * m + (n/m % 10 == 1) * (n%m + 1);
return ones;
}
};
自己寫的一個比較容易理解的程式碼
class Solution
{
public:
int NumberOf1Between1AndN_Solution (int n)
{
int ones = 0;
for (int m = 1; m <= n; m *= 10)
{
int bitNum=(n/m)%10;
int a=((n/m/10)+(bitNum>1))*m;
int b=(bitNum==1)*(n%m+1);
ones += a + b;
}
return ones;
}
};