郑州高端建站公司百度推广运营怎么做
给定一个整数 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; }
}
有点考研数学,做过一遍就会了。