您的位置:首页 > Web前端

剑指offer(16)-从1到n整数中1出现的次数

2016-12-21 17:40 260 查看
题目:求出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 number = 0;
for (int i = 0;i <= n;i++)
number += NumbersOf1(i);
return number;
}

int NumbersOf1(int n)
{
int numbers = 0;
while (n)
{
if (n % 10 == 1)
++numbers;
n = n / 10;
}
return numbers;
}
};


时间效率并不高,有很多非常高效的解法。

《编程之美》中运用找规律的方法,找到每一位为0,1或其它数时的1的计数规律,详细解释见相关章节,非常高效。

class Solution {
public:
int NumberOf1Between1AndN_Solution(int n)
{
int iCount = 0;
int iFactor = 1;
int iLowerNum = 0;
int iCurrentNum = 0;
int iHigherNum = 0;

while (n / iFactor != 0)
{
iLowerNum = n - (n / iFactor) * iFactor;
iCurrentNum = (n / iFactor) % 10;
iHigherNum = n / (iFactor * 10);

switch(iCurrentNum)
{
case 0:
iCount += iHigherNum * iFactor;
break;
case 1:
iCount += iHigherNum * iFactor + iLowerNum + 1;
break;
default:
iCount += (iHigherNum + 1) * iFactor;
break;
}
iFactor *= 10;
}
return iCount;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: