时间复杂度 O(logn) : 循环内的计算操作使用 O(1) 时间;循环次数为数字 n 的位数,即 log_10 ^ n ,因此循环使用 O(logn) 时间。
空间复杂度 O(1) : 几个变量使用常数大小的额外空间。
Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
classSolution: defNumberOf1Between1AndN_Solution(self, n): # write code here res = 0 digit, high, cur, low = 1, n//10, n%10, 0 while high!=0or cur!=0: if cur == 0: res += high * digit elif cur == 1: res += high*digit + low + 1 elif cur >= 2: res += (high+1) * digit
#cur决定了low的值,high决定了cur的值,所以变量执行顺序是low -> cur -> high
low += digit * cur # 当 high 和 cur 同时为 0 时,说明已经越过最高位,因此跳出 cur = high%10# 将 cur 加入 low ,组成下轮 low high //= 10# 将本轮 high 最低位删除,得到下轮 high digit *= 10# 位因子每轮 × 10 return res