41-剑指 Offer 43. 1~n 整数中 1 出现的次数

news2024/9/23 11:20:48

题目

输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。

例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。

示例 1:

输入:n = 12
输出:5

示例 2:

输入:n = 13
输出:6

限制:1 <= n < 2^31


思路

计算原则:先计算个位数上1的个数,再计算十位数上1的个数,之后再计算百位数上1的个数......由低位向高位逐位计算各个位上1的个数,最后将其全部相加即可。

如何计算各个位上1的个数?

①定义一个bit变量,表示要计算哪一位上1的个数,对应关系如下:

计算哪个位上1的个数bit
个位1
十位10
百位100
千位1000
............

②定义一个cur变量,表示bit位上当前的值cur = (n / bit) % 10

cur的右边表示低位,用low表示,low = n % bit

cur的左边表示高位,用high表示,high = n / bit / 10

③计算在bit位上一共有多少个1

cur > 1:强行将cur固定为1,再计算:bit位上1的个数 = (high + 1) * bit

cur == 1:要进行分类讨论,再计算:bit位上1的个数 = (high * bit) + (low + 1)

cur == 0:强行将cur固定为1,再计算:bit位上1的个数 = high * bit

④循环利用上述公式,由低位向高位逐位计算各个位上1的个数,最后将其全部相加得到sum即可。

:n = 501222

  • 计算个位上1的个数:bit = 1。
  1. cur = (n / bit) % 10 = (501222 / 1) % 10 = 2。
  2. low = n % bit = 501222 % 1 = 0。
  3. high = n / bit / 10 = 501222 / 1 / 10 = 50122。
  4. 此时cur > 1,强行将cur固定为1,再计算个位上1的个数 = (high + 1) * bit = (50122 + 1) * 1 = 50123。
  • 计算十位上1的个数:bit = 10。
  1. cur = (n / bit) % 10 = (501222 / 10) % 10 = 2。
  2. low = n % bit = 501222 % 10 = 2。
  3. high = n / bit / 10 = 501222 / 10 / 10 = 5012。
  4. 此时cur > 1,强行将cur固定为1,再计算个位上1的个数 = (high + 1) * bit = (5012 + 1) * 10 = 50130。
  • 计算百位上1的个数:bit = 100。
  1. cur = (n / bit) % 10 = (501222 / 100) % 10 = 2。
  2. low = n % bit = 501222 % 100 = 22。
  3. high = n / bit / 10 = 501222 / 100 / 10 = 501。
  4. 此时cur > 1,强行将cur固定为1,再计算百位上1的个数 = (high + 1) * bit = (501 + 1) * 100 = 50200。

  • 计算千位上1的个数:bit = 1000。
  1. cur = (n / bit) % 10 = (501222 / 1000) % 10 = 1。
  2. low = n % bit = 501222 % 1000 = 222。
  3. high = n / bit / 10 = 501222 / 1000 / 10 = 50。
  4. 此时cur == 1,要进行分类讨论,再计算千位上1的个数 = (high * bit) + (low + 1) = (50 * 1000) + (222 + 1) = 50000 + 223 = 50223。

  • 计算万位上1的个数:bit = 10000。
  1. cur = (n / bit) % 10 = (501222 / 10000) % 10 = 0。
  2. low = n % bit = 501222 % 10000 = 1222。
  3. high = n / bit / 10 = 501222 / 10000 / 10 = 5。
  4. 此时cur == 0,强行将cur固定为1,再计算万位上1的个数 = high * bit = 5 * 10000 = 50000。

  • 计算十万位上1的个数:bit = 100000。
  1. cur = (n / bit) % 10 = (501222 / 100000) % 10 = 5。
  2. low = n % bit = 501222 % 100000 = 1222。
  3. high = n / bit / 10 = 501222 / 100000 / 10 = 0.501222 约= 0。
  4. 此时cur > 1,强行将cur固定为1,再计算百位上1的个数 = (high + 1) * bit = (0 + 1) * 100000 = 100000。

1~501222这501222个整数的十进制表示中1出现的次数sum = 50123 + 50130 + 50200 + 50223 + 50000 + 100000 = 350676。


代码

class Solution {
    /**
     * 几个变量计算:cur = (n / bit) % 10, low = n % bit, high = n / bit / 10
     * 几个公式:
     * cur > 1 => (high + 1) * bit
     * cur == 1 => (high * bit) + (1 + low)
     * cur == 0 => high * bit
     * @param n
     * @return
     */
    public int countDigitOne(int n) {
        long bit = 1; //用int的话可能会有溢出风险
        long sum = 0; //计算最终的结果

        while(bit <= n) {
            long cur = (n / bit) % 10;
            long low = n % bit;
            long high = n / bit / 10;

            if(cur > 1) {
                sum += (high + 1) * bit;
            } else if(cur == 1) {
                sum += (high * bit) + (1 + low);
            } else {
                sum += high * bit;
            }
            bit = bit * 10;
        }
        return (int)sum;
    }
}
public class JZ43 {
    /**
     * 几个变量计算:cur = (n / bit) % 10, low = n % bit, high = n / bit / 10
     * 几个公式:
     * cur > 1 => (high + 1) * bit
     * cur == 1 => (high * bit) + (1 + low)
     * cur == 0 => high * bit
     * @param n
     * @return
     */
    public static void main(String[] args) {
        System.out.println(countDigitOne(501222));
    }

    public static int countDigitOne(int n) {
        long bit = 1; //用int的话可能会有溢出风险
        long sum = 0; //计算最终的结果

        while(bit <= n) {
            long cur = (n / bit) % 10;
            long low = n % bit;
            long high = n / bit / 10;

            if(cur > 1) {
                sum += (high + 1) * bit;
            } else if(cur == 1) {
                sum += (high * bit) + (1 + low);
            } else {
                sum += high * bit;
            }
            bit = bit * 10;
        }
        return (int)sum;
    }
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/181706.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Activiti工作流引擎】基本认识Activiti

Activiti工作流引擎 表的命名结构 ACT_RE &#xff1a;RE’表示 repository。这个前缀的表包含了流程定义和流程静态资源 &#xff08;图片&#xff0c;规则&#xff0c;等等&#xff09;。 ACT_RU&#xff1a;RU’表示 runtime。这些运行时的表&#xff0c;包含流程实例&am…

海外拥有最庞大社区人群的Verasity($VRA),后市值得期待

在2023年开年以来&#xff0c;随着主流标的回暖进一步带动大盘的上涨&#xff0c;并且加密货币总市值重回1亿美元以上。而加密货币市场大多数资产都迎来普涨。我们看到&#xff0c;短时的上涨虽然为市场重新注入信心&#xff0c;但能够持续具备上涨趋势的标的并不多。此前&…

layui框架实战案例(18):保存草稿和单选radio复选框checkbox无focus属性快速聚焦跳转的解决方案

系列文章目录 layui动态表格翻页和搜索的代码分析layui框架实战案例(3)&#xff1a;layui上传错误请求上传接口出现异常解决方案layui框架实战案例(9)&#xff1a;layPage 静态数据分页组件layui框架实战案例(10)&#xff1a;短信验证码60秒倒计时layui框架实战案例(11)&#…

SSE(Server-sent Events)实现Web消息推送(SpringBoot)

本文参考自&#xff1a; Web消息推送之SSE_魅Lemon的博客-CSDN博客_sse推送 【IT老齐237】超好用Web服务端主动推送技术SSE_哔哩哔哩_bilibili 1、Web消息推送简介 短轮询 长轮询 iframe流 SSE MQTT websocket 2、SSE原理介绍 2.1、概念 SSE(Server Sent Event)&…

43.Isaac教程--图像变形

图像变形 ISAAC教程合集地址: https://blog.csdn.net/kunhe0512/category_12163211.html 文章目录图像变形几何畸变图像投影透视畸变校正径向畸变校正切向畸变校正其他相机固有参数焦距主点&#xff08;投影中心&#xff09;未失真输出的光学特性输出主点输出焦距输出图像大小输…

最快的树视图组件:Flexible TreeView.NET Crack

为什么要使用灵活的 TreeView&#xff1f; 灵活性 市场上其他类似树视图的组件所不具备的无与伦比的可扩展性和独特功能。 表现 市场上最快的树视图组件。 仅需 0.39 秒即可添加 100,000 个节点。 简单 尽管是一个非常强大的树视图组件&#xff0c;但 Flexible TreeView 被设计…

Java开发基于rmi的数据库中间件设计源码,并利用中间件建立一个数据库应用(Java web项目),分布式对象技术课程实践

基于rmi的数据库中间件设计 介绍 分布式对象技术课程实践&#xff1a;基于rmi的数据库中间件设计&#xff0c;并利用中间件建立一个数据库应用&#xff08;Java web项目&#xff09;。 软件架构 前端&#xff1a;React后端&#xff1a;Springboot数据库中间件&#xff1a;J…

【人脸检测】------MTCNN算法

MTCNN算法出自深圳先进技术研究院,乔宇老师组,是今年2016的ECCV。 正如上图所示,该MTCNN由3个网络结构组成(P-Net,R-Net,O-Net)。 Proposal Network (P-Net):该网络结构主要获得了人脸区域的候选窗口和边界框的回归向量。并用该边界框做回归,对候选窗口进行校准,然后通…

Ubuntu18.04下QT和MYSQL异常问题排查处理常用命令

问题场景 &#xff1a;开年第一天上班&#xff0c;使用GIT下载好项目代码到本地后&#xff0c;发现QT5.14.2无法正常启动&#xff0c;使用命令sudo /opt/Qt5.14.2/Tools/QtCreator/bin/qtcreator后没有任何反应&#xff0c;仔细回想应该是年前电脑修改环境变量导致无法进入系统…

微信小程序安全系列——文本内容安全识别

前言 相信很多朋友跟我遇到过相同的问题&#xff0c;就是在开发一些笔记或者博客的时候&#xff0c;会遇到一些过滤敏感、时政、黄、赌、毒这类词汇、句子等这种棘手问题。 今天我们看一下微信小程序提供的文本安全内容识别&#xff0c;也可以减少一些我们的工作量。通过微信…

【通信原理(含matlab程序)】实验二:FM的调制和解调

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; 本人持续分享更多关于电子通信专业内容以及嵌入式和单片机的知识&#xff0c;如果大家喜欢&#xff0c;别忘点个赞加个关注哦&#xff0c;让我们一起共同进步~ &#x…

bug解决:Uncaught (in promise) TypeError: Toast.loading is not a function

在使用vue3做项目时&#xff0c;在其中使用了vant框架&#xff0c;在使用toast的加载组件或者是一些其他组件时&#xff0c;出现了如下的错误&#xff1a;Uncaught (in promise) TypeError: Toast.loading is not a function错误代码如下&#xff1a;Toast.loading({ message: …

二本土木工程毕业四年,成功转行大数据

1、 自我介绍 大家好&#xff0c;我是临渊羡鱼。18年毕业与重庆的一所二本大学&#xff0c;至今4年有余&#xff0c;专业是土木工程&#xff0c;毕业后从事三年半的建筑结构设计工作&#xff0c;在此期间由于不看好设计行业前景&#xff0c;故而在21年底谋求转行。在朋友推荐下…

[C语言]文件操作

目录 1.文件 1.1程序文件 1.2数据文件 2.文件名 3.文件的打开和关闭 3.1文件指针 3.2文件的打开和关闭 4.文件的顺序读写 4.1fgetc 4.2fputc 4.3fgets 4.4fputs 4.5fscanf 4.6fprintf 4.7fread&#xff08;二进制输出&#xff09; 4.8fwriite&#xff08;二进制输…

Python【xpath】实战案例【中】

获取全国地级城市名称&#xff1a;案例准备&#xff1a;导入外部库 1.requests、2.lxml容易遇到的问题&#xff1a;网站SSL认证失效代码块&#xff1a;#导入第三方库 import requests from lxml import etree # 网页地址 url https://www.aqistudy.cn/historydata/ #U-A伪装 h…

SOFA Weekly|SOFANews、issue 精选

SOFA WEEKLY | 每周精选 筛选每周精华问答&#xff0c;同步开源进展欢迎留言互动&#xff5e;SOFAStack&#xff08;Scalable Open Financial Architecture Stack&#xff09;是蚂蚁集团自主研发的金融级云原生架构&#xff0c;包含了构建金融级云原生架构所需的各个组件&#…

论文投稿指南——中文核心期刊推荐(公路运输)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…

Linux嵌入式开发——用户与用户组

文章目录Linux嵌入式开发——用户与用户组用户用户组创建用户和用户组1、图形化界面创建2、命令创建添加用户用户查询修改用户密码删除用户添加用户组显示组内用户名删除用户组Linux嵌入式开发——用户与用户组 用户 Linux是一个多用户操作系统&#xff0c;不同的用户拥有不同…

过年回家,你是否也像我一样努力生动的给别人解释软件开发是干啥滴?

这个年就这样&#xff0c;在喜气洋洋的气氛中&#xff0c;在我们依依不舍的留恋中&#xff0c;从我们身边溜走了。这次回家又碰见了亲戚们不厌其烦的问我&#xff0c;你做什么工作呐&#xff1f;于是就有了我以下生动的解释 目录 打字的 帮助传话&#xff0c;帮助卖东西 皮…

亚马逊云科技:强强联合助力中国头部车企打造优质服务体验

2023年1月9日在美国拉斯维加斯刚落幕的国际消费电子展&#xff08;CES 2023&#xff09;上&#xff0c;亚马逊云科技的2位重要合作伙伴BlackBerry和中国领先的车联网&#xff08;IoV&#xff09;技术服务与产品提供商博泰车联网共同宣布&#xff0c;由BlackBerry IVY™赋能的博…