从1到n整数中1出现的次数:O(logn)算法

本文详细介绍了如何通过O(logn)的时间复杂度计算从1到n整数中1出现的次数。解题思路包括将n的每一位单独分析,分别考虑个位和其他位的1出现次数,并给出了完整的Java代码实现及时间复杂度分析。
摘要由CSDN通过智能技术生成

转载原文:统计1数目

1. 题目描述

输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含1的数字有1,10,11和12,1一共出现了5次。

2. 题目来源

第一次看到是在《剑指Offer》第2版上,面试题32。leetcode和牛客网上都有这道题。

3. 本文的目的

看了《剑指Offer》上的解法,我觉得不能算好:

这段解释描述有些不清晰,而且没有图,难以理解。
从书中给出的实现上来看,显得有些凌乱。
在这篇博客里,会给出一个我对这道题的解法,包括完整的解题思路,完整代码,时间复杂度分析,以及在leetcode和牛客网上的提交结果。

4. 解题思路

考虑将n的十进制的每一位单独拿出讨论,每一位的值记为weight。

1) 个位

从1到n,每增加1,weight就会加1,当weight加到9时,再加1又会回到0重新开始。那么weight从0-9的这种周期会出现多少次呢?这取决于n的高位是多少,看图: 

以534为例,在从1增长到n的过程中,534的个位从0-9变化了53次,记为round。每一轮变化中,1在个位出现一次,所以一共出现了53次。 
再来看weight的值。weight为4,大于0,说明第54轮变化是从0-4,1又出现了1次。我们记1出现的次数为count࿰

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值