【LeetCode 233】所有小于等于n的整数中,1出现的总次数,(例如111算3次)
2016-05-05 22:07
543 查看
听说找工作的都推荐刷LeetCode,那我也搭配着做一些。
题目链接:
https://leetcode.com/problems/number-of-digit-one/
/*
题目:
给一个n, 找出从1到<=n,里所有整数的每一位上出现的1的总次数,例如n = 13, 则1,10,11,12,13,有6个1
思路:
暴力解法O(n), 当n到10^9会超时,故需要找规律
分析可得
0 - 9: 1个
10 - 99: 10 + 9 * 1
100 - 999: 100 +9 * (10 + 9 * 1 + 1)
1000 - 9999: 1000 + 9 * sum(2)
...
so:
1. 求出n的最高位,得到<=最高位-1位的sum
2. 加上当前最高位的,分为high==1, high>1,
3. 最高位得到的1的总个数 + 去掉最高位的总个数,迭代
*/
题目链接:
https://leetcode.com/problems/number-of-digit-one/
/*
题目:
给一个n, 找出从1到<=n,里所有整数的每一位上出现的1的总次数,例如n = 13, 则1,10,11,12,13,有6个1
思路:
暴力解法O(n), 当n到10^9会超时,故需要找规律
分析可得
0 - 9: 1个
10 - 99: 10 + 9 * 1
100 - 999: 100 +9 * (10 + 9 * 1 + 1)
1000 - 9999: 1000 + 9 * sum(2)
...
so:
1. 求出n的最高位,得到<=最高位-1位的sum
2. 加上当前最高位的,分为high==1, high>1,
3. 最高位得到的1的总个数 + 去掉最高位的总个数,迭代
*/
// 2016-5-5 20:17:32 // 2016-5-5 21:21:40 #include<stdio.h> #include<math.h> #include<iostream> using namespace std; _int64 a[10]; // 改成long long _int64 sum[10]; int init = 0; class Solution { public: int countDigitOne(int n) { int i, j; if (init == 0) { a[0] = 1; sum[0] = a[0]; for (i = 1; i <=9; i++) { a[i] = pow(10, i) + 9 * sum[i - 1]; sum[i] = sum[i - 1] + a[i]; } init = 1; /* for (i = 0; i<= 9; i++) { printf("%I64d ", a[i]); } printf("\n"); for (i = 0; i<= 9; i++) { printf("%I64d ", sum[i]); } printf("\n"); */ } if (n <= 0) return 0; int num[10]; int nBit = 0; int n2 = n; while (n2 != 0) { num[nBit++] = n2 % 10; n2 /= 10; } if (nBit == 1) { if (n >= 1) return 1; return 0; } int ans = 0; // ans += sum[nBit - 2]; int high = num[nBit - 1]; int low = n - high * pow(10, nBit - 1); if (high == 1) { ans += low + 1; } else { ans += pow(10, nBit - 1); ans += (high - 1) * sum[nBit - 2]; } ans += countDigitOne(low); return ans; } }; int main() { Solution s; cout<< s.countDigitOne(1234567890) << endl; return 0; }
相关文章推荐
- 自定义窗口并显示
- 重写TextField修改Placeholder
- c++primer plus 第六章习题
- java JDK的安装以及配置环境变量
- cocos2d-x安装教程
- Android JNI 本地开发接口
- Addressing Complex and Subjective Product-Related Queries with Customer Reviews-www2016-20160505
- 单例模式的七种写法
- 315. Count of Smaller Numbers After Self
- Monkey and Banana(DP)
- 查分序列(多次区间+)
- Java:按值传递还是按引用传递详细解说
- 重写setFrame更改控件的尺寸
- spring-boot 之 使用Admin监控应用
- oracle数据库删除数据Delete语句和Truncate语句的对比
- 查看ORACLE中正在运行的存储过程 kill
- spring-boot 之 使用Admin监控应用
- STM32F4学习笔记1
- [BZOJ1053] 反素数 - dfs
- Oracle体系结构