Number of Digit One(leetcode 233)
2015-07-11 19:56
447 查看
Given an integer n, count the total number of digit 1 appearing in all non-negative integers less than or equal to n.
For example:
Given n = 13,
Return 6, because digit 1 occurred in the following numbers: 1, 10, 11, 12, 13.
1。 最笨方法, 从1到n,看一看每个数有多少个1,最后相加。超时
2。 有规律的
一位数中1个数 1
两位数中1个数 一位数*10 + 一位数个数(10的一次方)
三位数中1个数 两位数*10 + 两位数个数(10的二次方)
如果某一位为0 跳过
为1 为低位数的和+1
》=2 为 n*第几位
。。。。。。。。。。。。。。
对整数 abcdef
就是 0-f 中 1 + 0-e*10 中1 + 0- c* 10* 10 中1 。。。
网上同样思路,不过公式化
以算百位上1为例子: 假设百位上是0, 1, 和 >=2 三种情况:
case 1: n=3141092, a= 31410, b=92. 计算百位上1的个数应该为 3141 *100 次.
case 2: n=3141192, a= 31411, b=92. 计算百位上1的个数应该为 3141 *100 + (92+1) 次.
case 3: n=3141592, a= 31415, b=92. 计算百位上1的个数应该为 (3141+1) *100 次.
以上三种情况可以用 一个公式概括:
(a + 8) / 10 * m + (a % 10 == 1) * (b + 1)
http://www.2cto.com/kf/201507/415690.html
For example:
Given n = 13,
Return 6, because digit 1 occurred in the following numbers: 1, 10, 11, 12, 13.
1。 最笨方法, 从1到n,看一看每个数有多少个1,最后相加。超时
2。 有规律的
一位数中1个数 1
两位数中1个数 一位数*10 + 一位数个数(10的一次方)
三位数中1个数 两位数*10 + 两位数个数(10的二次方)
如果某一位为0 跳过
为1 为低位数的和+1
》=2 为 n*第几位
。。。。。。。。。。。。。。
对整数 abcdef
就是 0-f 中 1 + 0-e*10 中1 + 0- c* 10* 10 中1 。。。
class Solution { public: int countDigitOne(int n) { if (n <= 0) { return 0; } vector<int> c; // c[1] 一位数中1的个数 // c[2] 两位数中1个数 。。。。。 vector<int> num; //输入的数转化为倒序int数组 int total = 0; c.push_back(0); c.push_back(1); // 0-9 // 将数打散 while (n != 0) { int t = n % 10; num.push_back(t); n = n / 10; } // 计算几位数应该有多少个1 for(int i = 2; i < num.size(); ++i) { c.push_back(10*c[i-1] + gen10(i - 1)); } for(int j = 0; j < num.size(); ++j) { total = total + (num[j]) * c[j]; // 大于1 if (num[j] > 1) { total += gen10(j); } // 为1 if (num[j] == 1) { int tmp = 0; for (int k = j - 1; k >= 0; --k) { tmp = tmp * 10 + num[k]; } total += tmp; total += 1; } } return total; } // 10的多少次方 int gen10(int i) { int t = 1; for(int j = 0; j < i; ++j) { t*= 10; } return t; } };
网上同样思路,不过公式化
以算百位上1为例子: 假设百位上是0, 1, 和 >=2 三种情况:
case 1: n=3141092, a= 31410, b=92. 计算百位上1的个数应该为 3141 *100 次.
case 2: n=3141192, a= 31411, b=92. 计算百位上1的个数应该为 3141 *100 + (92+1) 次.
case 3: n=3141592, a= 31415, b=92. 计算百位上1的个数应该为 (3141+1) *100 次.
以上三种情况可以用 一个公式概括:
(a + 8) / 10 * m + (a % 10 == 1) * (b + 1)
public class Solution { public int countDigitOne(int n) { int ones = 0; for (long m = 1; m <= n; m *= 10) { long a = n/m, b = n%m; ones += (a + 8) / 10 * m; if(a % 10 == 1) ones += b + 1; } return ones; } }
http://www.2cto.com/kf/201507/415690.html
相关文章推荐
- Android 开源库和项目
- fpc : lazarus IDE 1.4.4 下载
- oracle数据库的导入dmp文件和导出dmp文件
- Java 笔试基础题
- flash语法编写规则的技巧经验详解
- Hadoop的组成
- iOS从info.plist获取项目的名称及版本号
- 字符,字节和编码
- 老伴说我每个标点符号后都打一个空格, 我才意识到真有这个问题,其实就是个职业病吧
- 类和对象
- qsort用法
- CSDN的markdown功能还不错呀,打算开始写博客了
- 括号匹配问题
- cacti安装
- C++11变参模板
- LeetCode Palindrome Linked List
- oracle常用到的一些应用(创建用户,用户授权)
- codeforce 3B. Lorry(贪心)
- PreparedStatement与Statement的区别
- MFC界面库BCGControlBar的介绍