leetcode链接:https://leetcode-cn.com/problems/1nzheng-shu-zhong-1chu-xian-de-ci-shu-lcof/
输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。
例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。
示例 1:
输入:n = 12 输出:5示例 2:
输入:n = 13 输出:6
解题思路:
根据当前位 curcurcur 值的不同,分为以下三种情况:
当 cur=0cur = 0cur=0 时: 此位 111 的出现次数只由高位 highhighhigh 决定,计算公式为:high×digit
当 cur=1cur = 1cur=1 时: 此位 111 的出现次数由高位 highhighhigh 和低位 lowlowlow 决定,计算公式为:high×digit+low+1
当 cur=2,3,⋯ ,9cur = 2, 3, \cdots, 9cur=2,3,⋯,9 时: 此位 111 的出现次数只由高位 highhighhigh 决定,计算公式为:(high+1)×digit
class Solution {
public int countDigitOne(int n) {
int high = n/10;
int cur = n%10;
int low = 0;
int digit = 1;
int sum = 0;
while(high != 0 || cur != 0){
if(cur == 0){
sum += high * digit;
}else if(cur == 1){
sum += high * digit + low + 1;
}else{
sum += (high+1) * digit;
}
low += cur *digit;
cur = high % 10;
high /= 10;
digit *= 10;
}
return sum;
}
}