标签:leetcode
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.
题目理解:
题目的意思是给定一个数n,计算[0, n]的区间中1出现的次数。
具体思路:
在面试过程中如果被问到类似的题目,一定不要着急,因为这肯定是一道找规律的题目。最好的办法是在白纸上写一个差不多大的数,然后分析如何计算每一位1出现的次数。
以24071为例,如果我们想计算百位上1出现的次数,具体思路如下:
这是百位为0的情况,如果百位为1的时候,那除了上述的(24*100)个1之外,还包括:24100~24171,共(71 + 1)个1,即总共:24 * 100 + 71 + 1。
如果百位大于1例如为6的时候,那除了最开始的(24*100)个1之外,还包括了:24100~24199,共100个1,即总共:(24 + 1)*100。
总结规律
其实通过上面的分析,我们就可以归纳出一个规律如下。
要求第i位1出现的次数,并且i的高位数为highN,低位数为lowN,当前第i位的数字为cdigit,则当前i位1出现的次数分三种情况:
其中,factor为当前的乘积因子,例如百位的factor为100,十位的乘积因子为10。
有了规律,代码只要按照规律写出来即可。
public class NumberofDigitOne {
public int countDigitOne(int n) {
int count = 0;
long factor = 1;
long cdigit = 0;
long highN = 0;
int lowN = 0;
while (n / factor > 0) {
cdigit = (n % (factor * 10)) / factor;
highN = n / (factor * 10);
if (cdigit == 0) {
count += highN * factor;
} else if (cdigit == 1) {
count += highN * factor + lowN + 1;
} else {
count += (highN + 1) * factor;
}
lowN += cdigit * factor;
factor *= 10;
}
return count;
}
public static void main(String[] args) {
int n = 1410065408;
NumberofDigitOne ndo = new NumberofDigitOne();
int count = ndo.countDigitOne(n);
System.out.println(count);
}
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
[LeetCode]Number of Digit One,解题报告
标签:leetcode
原文地址:http://blog.csdn.net/wzy_1988/article/details/47148263