输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。
例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。
示例 1:
输入:n = 12
输出:5
示例 2:
输入:n = 13
输出:6
思路:数字n各数位上出现1的次数之和即为1-n中1出现的次数。将数字n分成高位,当前位和低位。如1234,当前位为3的话,高位为12,低位为4。当前位出现1的次数有如下规律:如果当前位为0,则出现次数 = 高位 * 当前数位;当前位为1,则出现次数 = 高位 * 当前数位 + 低位 + 1;当前位为[2-9]中的数字,出现次数为(高位 + 1)* 当前数位。
public int countDigitOne(int n) {
int res = 0;
long i = 1; //当前数位
while(n / i != 0){
long high = n / (10 * i); //当前高位
long cur = (n / i) % 10; //当前位
long low = n - (n / i) * i; //当前低位
if(cur == 0){
res += high * i;
}else if(cur == 1){
res += high * i + low + 1;
}else{
res += (high + 1) * i;
}
i *= 10; // 数位上升
}
return res;
}
参考:https://leetcode-cn.com/problems/1nzheng-shu-zhong-1chu-xian-de-ci-shu-lcof