链接
LeetCode:剑指 Offer 15. 二进制中1的个数
剑指 Offer 43. 1~n 整数中 1 出现的次数
思路
简单的方法,先算出每个数1的个数,然后汇总。
进阶方法,时间复杂度O(logn):
从1到n整数中1出现的次数:O(logn)算法
代码
牛客:
public class Solution {
public int getNumber1(int n) {
int count = 0;
while (n != 0) {
if (n % 10 == 1) {
count++;
}
n /= 10;
}
return count;
}
public int NumberOf1Between1AndN_Solution(int n) {
int sum = 0;
for (int i = 1; i <= n; i++) {
sum += getNumber1(i);
}
return sum;
}
}
LeetCode:
class Solution {
public int countDigitOne(int n) {
int digit = 1, res = 0;
int high = n / 10, cur = n % 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;
}
}