Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >[剑指offer] 整数中1出现的次数(从1到n整数中1出现的次数)

[剑指offer] 整数中1出现的次数(从1到n整数中1出现的次数)

作者头像
尾尾部落
发布于 2018-09-04 06:51:32
发布于 2018-09-04 06:51:32
1.1K00
代码可运行
举报
文章被收录于专栏:尾尾部落尾尾部落
运行总次数:0
代码可运行
题目描述

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

解题思路

三种解法:

  • 法一:依次遍历每个数,判断每个数里面是否包含1
  • 法二:同法一,将数字转成字符串,直接判断
  • 法三:归纳法

设N = abcde ,其中abcde分别为十进制中各位上的数字。 如果要计算百位上1出现的次数,它要受到3方面的影响:百位上的数字,百位以下(低位)的数字,百位以上(高位)的数字。 ① 如果百位上数字为0,百位上可能出现1的次数由更高位决定。比如:12013,则可以知道百位出现1的情况可能是:100~199,1100~1199,2100~2199,,…,11100~11199,一共1200个。可以看出是由更高位数字(12)决定,并且等于更高位数字(12)乘以 当前位数(100)。 ② 如果百位上数字为1,百位上可能出现1的次数不仅受更高位影响还受低位影响。比如:12113,则可以知道百位受高位影响出现的情况是:100~199,1100~1199,2100~2199,,….,11100~11199,一共1200个。和上面情况一样,并且等于更高位数字(12)乘以 当前位数(100)。但同时它还受低位影响,百位出现1的情况是:12100~12113,一共114个,等于低位数字(113)+1。 ③ 如果百位上数字大于1(2~9),则百位上出现1的情况仅由更高位决定,比如12213,则百位出现1的情况是:100~199,1100~1199,2100~2199,…,11100~11199,12100~12199,一共有1300个,并且等于更高位数字+1(12+1)乘以当前位数(100)。 ——参考牛客网@藍裙子的百合魂

参考代码

法一:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Solution {
    public int NumberOf1Between1AndN_Solution(int n) {
        int res = 0;
        for(int i = 1; i <= n; i++)
            res += number1(i);
        return res;
    }

    public int number1(int n){
        int res = 0;
        while(n>0){
            if(n % 10 == 1)
                res++;
            n /= 10;
        }
        return res;
    }
}

法二:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Solution {
    public int NumberOf1Between1AndN_Solution(int n) {
        int res = 0;
        StringBuffer s = new StringBuffer();
        for(int i = 1; i<=n; i++){
            s.append(i);
        }
        String str = s.toString();
        for(int i=0; i<str.length(); i++){
            if(str.charAt(i) == '1')
                res++;
        }
        return res;
    }
}

法三:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Solution {
    public int NumberOf1Between1AndN_Solution(int n) {
        int res = 0;
        int cur = 0, before = 0, after = 0;
        int i = 1;
        while(i<=n){
            before = n/(i*10);
            cur = (n/i)%10;
            after = n - n/i*i;
            if(cur == 0){
                // 如果为0,出现1的次数由高位决定,等于高位数字 * 当前位数
                res += before * i;
            }else if(cur == 1){
                // 如果为1, 出现1的次数由高位和低位决定,高位*当前位+低位+1
                res += before * i + after + 1;
            }else{
                // 如果大于1, 出现1的次数由高位决定,(高位数字+1)* 当前位数
                res += (before + 1) * i;
            }
            i *= 10;
        }
        return res;
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
[剑指offer题解][Java]1到n整数中1出现的次数
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
蛮三刀酱
2019/09/10
7140
[剑指offer题解][Java]1到n整数中1出现的次数
求出1 ~ 13的整数中1出现的次数,并算出100 ~ 1300的整数中1出现的次数?为此他特别数了一下1 ~ 13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。
Rude3Knife的公众号
2019/08/06
7350
整数中1出现的次数
题目 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数? 为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。 ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。
名字是乱打的
2022/05/13
7230
《剑指offer》– 数组中的逆序对、最小的K个数、从1到n整数中1出现的次数、正则表达式匹配、数值的整数次方
数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007。
全栈程序员站长
2021/12/23
9450
《剑指offer》– 数组中的逆序对、最小的K个数、从1到n整数中1出现的次数、正则表达式匹配、数值的整数次方
统计0到n之间1的个数[数学,动态规划dp](经典,详解)
问题描述 给定一个十进制整数N,求出从1到N的所有整数中出现”1”的个数。 例如:N=2时 1,2出现了1个 “1” 。 N=12时 1,2,3,4,5,6,7,8,9,10,11,12。出现了5个“1”。 方法一 暴力求解 最直接的方法就是从1开始遍历到N,将其中每一个数中含有“1”的个数加起来,就得到了问题的解。 下面给出代码: 1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 int mai
Angel_Kitty
2018/04/08
1.1K0
整数中1出现的次数(从1到n整数中1出现的次数)_31
注解:参考一位牛友提到的leetcode的链接网址(包括求1~n的所有整数中2,3,4,5,6,7,8,9出现的所有次数) 通过使用一个 位置乘子m 遍历数字的位置, m 分别为1,10,100,1000…etc.(m<=n)
名字是乱打的
2021/12/23
1K0
整数中1出现的次数(从1到n整数中1出现的次数)_31
剑指offer 43——1~n整数中1出现的次数
例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。
健程之道
2020/06/16
3470
剑指Offer(三十一)-- 整数中1出现的次数
求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。
秦怀杂货店
2022/02/15
3560
每天一道剑指offer-整数中1出现的次数
求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。
乔戈里
2019/03/06
8060
C++版 - 剑指offer 面试题32:从1到n整数中1出现的次数(leecode233. Number of Digit One) 题解
剑指offer 面试题32:从1到n整数中1出现的次数(Leecode233. Number of Digit One)
Enjoy233
2019/03/05
6300
【剑指Offer】43. 从 1 到 n 整数中 1 出现的次数
思路是分别计算个位、十位、百位…上出现 1 的个数。 以 n =216为例: 个位上: 1 ,11,21,31,…211。个位上共出现(216/10)+ 1个 1 。因为除法取整,210~216间个位上的1取不到,所以我们加8进位。你可能说为什么不加9,n=211怎么办,这里把最后取到的个位数为1的单独考虑,先往下看。 十位上:1019,110119,210~216. 十位上可看成 求(216/10)=21 个位上的1的个数然后乘10。这里再次把最后取到的十位数为1的单独拿出来,即210~216要单独考虑 ,个数为(216%10)+1 .这里加8就避免了判断的过程。 后面以此类推。 时间复杂度 O(logN)
瑞新
2020/12/07
5560
【剑指Offer】43. 从 1 到 n 整数中 1 出现的次数
【leetcode】43.1~n整数中1出现的次数
例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。
海盗船长
2020/08/27
1K0
算法题目(三)
第一步在树A中查找与根结点的值一样的结点,这实际上就是树的遍历。递归调用HasSubTree遍历二叉树A。如果发现某一结点的值和树B的头结点的值相同,则调用DoesTreeHavaTree2,做第二步判断。
Helloted
2022/06/06
3010
【算法专栏】整数中1出现的次数
求出 1~13的整数中1出现的次数,并算出 100~1300的整数中1出现的次数?为此他特别数了一下 1~13中包含1的数字有 1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。
ConardLi
2019/05/23
5970
剑指Offer-整数中1出现的次数(从1到n整数中1出现的次数)
package Other; /** * 整数中1出现的次数(从1到n整数中1出现的次数) * 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数? * 为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。 * ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。 */ public class Solution21 { public static void ma
武培轩
2018/04/18
9160
【剑指offer】31.整数中1出现的次数
求出1 ~ 13的整数中1出现的次数,并算出100 ~ 1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。
AI那点小事
2020/07/21
3560
Sword To Offer 031 - 整数中1出现的次数(从1到n整数中1出现的次数)
求出113的整数中1出现的次数,并算出1001300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。
Reck Zhang
2021/08/11
5280
剑指offer No.31 整数中1出现的次数
求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。
week
2020/04/22
2710
剑指Offer的学习笔记(C#篇)-- 整数中1出现的次数(从1到n整数中1出现的次数)
原谅我只会最垃圾的办法,难受啊,马飞!!这种方法的思路就是一次次的除10取余数,余数是1就+1,效率低的一笔。。
WeiMLing
2019/08/23
5890
牛客网-剑指offer-10
主要是想为什么会有最大的和,一个情况是,新加上的数比原来的数都要大,就要开始考虑需不需要原来的数了。所以我们需要两个数,一个保存最大的和,用来返回,一个 保存当前的和,可以在适当的时候丢掉。 另一种情况,加入的数都比原来的小,即都是负数的时候,可能最大和只是一个最小的数;另外,当都是正数的时候也比较好解决。 代码如下:
小二三不乌
2018/08/07
4780
推荐阅读
相关推荐
[剑指offer题解][Java]1到n整数中1出现的次数
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验