按位统计:统计每个位等于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


全部评论

相关推荐

06-20 17:42
东华大学 Java
凉风落木楚山秋:要是在2015,你这简历还可以月入十万,可惜现在是2025,已经跟不上版本了
我的简历长这样
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务