输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。
例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。
剑指 Offer 43. 1~n 整数中 1 出现的次数 - 力扣(LeetCode) (leetcode-cn.com)
题目要求的是从1-n中每一位上出现1的次数之和,可以一位一位的来看,就是先固定n的某一位cur,比n小的整数中当前位为1有多少种可能情况,设比当前位低的所有位统计看作低位low,比当前位高的所有位统一看作高位high,digit是当前位的位因子,如果当前位是十位,digit=10,以此类推。把n的当前位分成0,1,大于1三种情况,分开讨论。
如果n的当前位cur是0,其它的每一位都可以是0-9,那么比n小的数中,当前位为1的情况有high * digit种;如果当前位是1,那么比n小的数中,当前位为1的情况有high * digit + low + 1种;如果当前位大于1,那么比n小的数中,当前位为1的情况有(high + 1) * digit 种.
class Solution {
public int countDigitOne(int n) {
int res = 0;
long cur;
long high;
long low;
long digit = 1;
while(true){
high = n / (digit * 10);
low = n % digit;
cur = n % (digit * 10) / digit;
if(high == 0 && cur == 0){
break;
}
if(cur == 0){
res += high * digit;
}else if(cur == 1){
res += high * digit + low + 1;
}else{
res += (high + 1) * digit;
}
digit *= 10;
}
return res;
}
}