Day 18:数字 1 的个数
给定一个整数 num
,计算所有小于等于 num
的非负整数中数字 1
出现的个数。
示例 1:
输入:num = 0 输出:0
示例 2:
输入:num = 13 输出:6
LCR 162. 数字 1 的个数 - 力扣(LeetCode)
暴力求解:复杂度太高
class Solution {
public int digitOneInNumber(int num) {
if (num < 1) {
return 0;
}
int totalOnes = 0;
for (int i = 1; i <= num; i++) {
totalOnes += countOne(i);
}
return totalOnes;
}
public int countOne(int num){
String str = Integer.toString(num);
int count = 0;
for (char c : str.toCharArray()) {
if (c == '1') {
count++;
}
}
return count;
}
}
参考那种滚轮密码锁。
我们设定当前位为cur,比如511322,当前位为3 ,那么我们不难发现,当前位为1时,个数有511*100种。 如果当前位为1,那么只有510*100+1*22种,当前位为0时,后三位为022,比100小,那么就只有511种。我们依次遍历这个数的各个位就行了。
class Solution {
public int digitOneInNumber(int num) {
int digit = 1, res = 0;
int high = num / 10, cur = num % 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;
}
}
有点考研数学,做过一遍就会了。