《leetCode》: Number of Digit One
来源:互联网 发布:德国圣母知乎 编辑:程序博客网 时间:2024/06/02 06:01
题目
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.
Hint:Beware of overflow.
思路
intuitive: 每10个数, 有一个个位是1, 每100个数, 有10个十位是1, 每1000个数, 有100个百位是1. 做一个循环, 每次计算单个位上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);
public int countDigitOne(int n){ if(n<0){ return 0; } int res = 0; for(int m=1;m<=n;m*=10){ int a = n/m; int b = n%m; int ones = ((a+8)/10)*m; if(a%10==1){ ones +=(b+1); } res += ones; } return res; }
以上的代码还存在一点点的溢出的问题,就如题目中给予的提示一样:
修正的方法为:将int类型的变量变为long类型的变量
修正后的代码如下:
public class Solution { public int countDigitOne(int n){ if(n<0){ return 0; } int res = 0; for(long m=1;m<=n;m*=10){ long a = n/m; long b = n%m; long ones = ((a+8)/10)*m; if(a%10==1){ ones +=(b+1); } res += ones; } return res; } }
1 0
- Number of Digit One 【leetcode】
- [leetcode] Number of Digit One
- [LeetCode] Number of Digit One
- LeetCode ||Number of Digit One
- Number of Digit One -- leetcode
- *LeetCode-Number of Digit One
- [LeetCode] Number of Digit One
- Leetcode Number of Digit One
- Leetcode: Number of Digit One
- Leetcode Number of Digit One
- leetcode:Number of Digit One
- 《leetCode》: Number of Digit One
- Leetcode Number of Digit One
- Number of Digit One leetcode
- leetcode 233: Number of Digit One
- Leetcode 233 Number of Digit One
- [leetcode] 233.Number of Digit One
- LeetCode-Number of Digit One-解题报告
- PHP判断是否是手机浏览页面,是的话跳转到手机页面。
- 01.线性表.顺序存储结构(静态数组)
- 绘制多边形
- 一个用servlet写的上传下载
- 数组形参
- 《leetCode》: Number of Digit One
- Spark学习笔记(一)--RDD编程
- javascript中 startsWith , endsWith 方法
- Elasticsearch简介
- 看看PHP迭代器的内部执行过程以及用PHP迭代器来实现一个斐波纳契数列
- Android第三方开源库收集整理
- 获取当前系统时间戳的方法
- 《leetCode》: Count Complete Tree Nodes
- [绍棠] SDWebImage 手动清除缓存及SDWebImage缓存图片的机制