整数中1出现的次数
来源:互联网 发布:u盘低格后数据恢复 编辑:程序博客网 时间:2024/06/06 12:43
http://www.cnblogs.com/cyjb/p/digitOccurrenceInRegion.html
一个更好的办法是利用数学公式直接计算出最终的结果,该方法是依次求出数字 X 在个位、十位、百位等等出现的次数,再相加得到最终结果。这里的
首先要知道以下的规律:
- 从 1 至 10,在它们的个位数中,任意的 X 都出现了 1 次。
- 从 1 至 100,在它们的十位数中,任意的 X 都出现了 10 次。
- 从 1 至 1000,在它们的千位数中,任意的 X 都出现了 100 次。
依此类推,从 1 至
这个规律很容易验证,这里不再多做说明。
接下来以
现在依次分析这些数据,首先是个位。从 1 至 2590 中,包含了 259 个 10,因此任意的 X 都出现了 259 次。最后剩余的三个数 2591, 2592 和 2593,因为它们最大的个位数字 3 < X,因此不会包含任何 5。
然后是十位。从 1 至 2500 中,包含了 25 个 100,因此任意的 X 都出现了
接下来是百位。从 1 至 2000 中,包含了 2 个 1000,因此任意的 X 都出现了
最后是千位。现在已经没有更高位,因此直接看最大的千位数字 2 < X,所以不会包含任何 5。到此为止,已经计算出全部数字 5 的出现次数。
总结一下以上的算法,可以看到,当计算右数第
- 取第
i 位左边(高位)的数字,乘以10i−1 ,得到基础值a 。 - 取第
i 位数字,计算修正值:- 如果大于 X,则结果为
a+10i−1 。 - 如果小于 X,则结果为
a 。 - 如果等 X,则取第
i 位右边(低位)数字,设为b ,最后结果为a+b+1 。
- 如果大于 X,则结果为
相应的代码非常简单,效率也非常高,时间复杂度只有
class Solution {
public:
// 计算从0到n中1的总数
//暴力解法
int NumberOf1Between1AndN_Solution(int n)
{
/* int count = 0;
for(int i=0;i<=n;i++) {
count += NumberOf1(i);
}
return count;
}
// 计算数字n中1的个数
int NumberOf1(int n)
{
int count = 0;
while(n) {
if(n%10 == 1) count++;
n /= 10;
}
return count;
}*/
int cnt = 0, k;
for(int i=1;k = n/i;i *= 10) {
// 高位的数字。
int high = k / 10;
/* if (x == 0) {
if (high) {
high--;
} else {
break;
}
}*/
cnt += high * i;
// 当前位的数字。
int cur = k % 10;
if (cur > 1) {
cnt += i;
} else if (cur == 1) {
// n - k * i 为低位的数字。
cnt += n - k * i + 1;
}
}
return cnt;
}
};
- :整数中1出现的次数
- 整数中1出现的次数
- 整数中1出现的次数
- 整数中1出现的次数
- 整数中1出现的次数
- 整数中1出现的次数
- 整数中1出现的次数
- 整数中1出现的次数
- 整数中1出现的次数
- 整数中1出现的次数
- 整数中1出现的次数
- 整数中1出现的次数
- 整数中1出现的次数
- 整数中1出现的次数
- 整数中1出现的次数
- 整数中1出现的次数
- 整数中1出现的次数
- 整数中1出现的次数
- 数据库----单表查询
- tf.contrib
- 如何取出表中指定区间的记录
- Unity3D中通过代码修改子物体层级的顺序
- 机器学习的损失函数
- 整数中1出现的次数
- 2017湘潭赛XTU1267Highway
- [模板]poj3259(判断是否存在负环)
- vi三种模式
- React-Native项目中使用TabBar
- 树控件示例
- Python
- 国内人脸识别研究现状2010年之前
- 马氏距离+协方差公式+无偏估计