按位统计:统计每个位等于1的个数。
整数中1出现的次数(从1到n整数中1出现的次数)
https://www.nowcoder.com/practice/bd7f978302044eee894445e244c7eee6
思路:按位统计。
参数:当前位cur,高位high,低位low,权重digit。
当前位等于1的个数 = 高位的变化数 * 权重。(权重,表示低位可以随意变化,所以乘上随意变化的个数)
举例: 统计2304的十位为1的个数。cur = 0, high = 23, low = 4, digit = 10。
高位从0 ~ 22都是可以的(001-221嘛),所以是high * digit = 23 * 10。之所以乘上digit,是表示低位可以随意变化的个数(2210-2219有10个,都符合十位为1嘛)。
三种情况:
当前位 = 0:
高位可以是0 ~ high - 1,总个数是high * digit
当前位 = 1:
高位可以是0 ~ high - 1,但要多出几个低位的可能数:low +1(因为当前位就是1,后面的低位都是可以的变化)
总个数是high * digit + low + 1
当前位 = 2 ~ 9:
高位可以是0 ~ high,总个数是(high + 1) * digit
class Solution: def NumberOf1Between1AndN_Solution(self, n: int) -> int: res = 0 # 高位、当前位、低位、权重的初始化 high, cur, low, digit = n // 10, n % 10, 0, 1 # 循环是从低到高的,如果高位和当前位都=0,则代表循环出最高位了 while high != 0 or cur != 0: if cur == 0: res += high * digit elif cur == 1: res += high * digit + low + 1 else: res += (high + 1) * digit # 参数更新 low += cur * digit cur = high % 10 high //= 10 digit *= 10 return res