剑指offer-31-连续子数组的最大和

整数中1出现的次数(从1到n整数中1出现的次数)_牛客网

https://www.nowcoder.com/practice/bd7f978302044eee894445e244c7eee6?tpId=13&tqId=11184&rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

求出1-13的整数中1出现的次数,并算出100-1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。

其实这道题目需要比较深刻的数学归纳计算法进行计算,才能够用几行代码就可以解决。
个位数上的1的个数:(n/10)1 + if(n%10)<1?0:((n%10-1)+1)
*
十位数上的1的个数:(n/100)10 + if(n%100)<10?0:((n%100-10)+1)
*
百位数上1的个数:
(n/1000)100 + if(n%1000)<100?0:((n%1000-100)+1)
*
总计i:*(n/(10i))i + if(n%(10i))< i ?0:((n%(10*i)-i)+1)
i是小于n的最高位数目:i=pow(10, log10(n))

public class Solution {
    public int NumberOf1Between1AndN_Solution(int n) {
        if(n <= 0)return 0;
        int count = 0;
        for(int i=1; i <= n; i*=10){
            //计算在第i位上总共有多少个1
            count = count + (n/(10*i))*i;
            //不足i的部分有可能存在1
            int mod = n%(10*i);
   

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

小白刷剑指offer 文章被收录于专栏

跟着小白一起刷剑指offer,通过讨论加深印象吧~ 没有人不学习就能够掌握知识,知识就是需要学习的~

全部评论
为什么没有人考虑会重复的问题呢,比如说个位数等于1的时候,十位数可能等于1,但是在十位数等于1的时候,个位数等于1,这两数是一样的,但是可能会重复出现吗
4 回复 分享
发布于 2020-03-13 14:06
应该是 **个位数上的1的个数:(n/10)*1 + (n%10)<1 ? 0 : (n%10 ≥ 2 ? 1 : (n%10-1)+1)** **十位数上的1的个数:(n/100)*10 + (n%100)<10 ? 0 : (n%100 ≥ 20 ? 10 : ( n%100-10)+1 )** **百位数上1的个数:(n/1000)*100 + (n%1000)<100 ? 0 : (n%1000 ≥ 200 ? 100 : (n%1000-100)+1)**
3 回复 分享
发布于 2020-02-02 16:09
看题解都看不懂,怀疑自己不适合编程
2 回复 分享
发布于 2020-04-04 17:02
公式是错的,浪费好久时间
点赞 回复 分享
发布于 2021-03-07 22:29
真坑
点赞 回复 分享
发布于 2020-03-15 15:46

相关推荐

03-29 14:19
门头沟学院 Java
你背过凌晨4点的八股文么:加油同学,人生的容错率很高,只是一个暑期罢了,后面还有很多机会!
点赞 评论 收藏
分享
评论
9
1
分享

创作者周榜

更多
牛客网
牛客企业服务