题目描述
测试用例
-
剑指 Offer 43. 1~n 整数中 1 出现的次数
难度困难160
输入一个整数
n,求1~n这n个整数的十进制表示中1出现的次数。例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。
示例 1:
输入:n = 12 输出:5示例 2:
输入:n = 13 输出:6限制:
1 <= n < 2^31
题目考点
- 考察应聘者优化的激情和能力。最原始的方法大部分应聘者都能想到。当面试官提示还有更快的方法之后,应聘者千万不要轻易放弃尝试。必要的时候可以要求面试官给出提示。
- 考察应聘者面对复杂问题的分析能力,可以通过分析具体例子一步步找到通用的规律。
解题思路
主要思路:分别对每个数位(如个位、十位、百位等)上可能出现1的数进行统计
根据设定的整位,对n进行分割,分为两部分,高位n/i,低位n%i
情况1:
当i表示百位,且百位对应的数为0,如n=31056,i=100,则a=310,b=56,此时百位为1的次数有a/10*100=31000
情况2:
当i表示百位,且百位对应的数为1,如n=31156,i=100,则a=311,b=56,此时百位对应的就是1,则共有a%10=31次是包含100个连续点,当最高两位为31(即a=311),本次只对应局部点00~56,共b+1次,所有点加起来共有a/10*100+(b+1),这些点百位对应为1
情况3:
当i表示百位,且百位对应的数>=2,如n=31456,i=100,则a=314,b=56,此时百位为1的次数有a/10+1=32(最高两位0~31),每一次都包含100个连续的点,即共有(a/10+1)*100个点的百位为1
参考解题
class Solution {
public int countDigitOne(int n) {
int digit = 1, res = 0;
int high = n / 10, cur = n % 10, low = 0;
while(high != 0 || cur != 0) {
if(cur == 0) res += high * digit;
else if(cur == 1) res += high * digit + low + 1;
else res += (high + 1) * digit;
low += cur * digit;
cur = high % 10;
high /= 10;
digit *= 10;
}
return res;
}
}
本文标题:剑指Offer系列(java版,详细解析)43. 1~n整数中1出现的次数
本文链接:https://blog.quwenai.cn/post/5143.html
版权声明:本文不使用任何协议授权,您可以任何形式自由转载或使用。






还没有评论,来说两句吧...