剑指offer(C++)-JZ43:整数中1出现的次数(算法-其他)

news2024/10/5 13:49:38

作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

题目描述:

输入一个整数 n ,求 1~n 这 n 个整数的十进制表示中 1 出现的次数
例如, 1~13 中包含 1 的数字有 1 、 10 、 11 、 12 、 13 因此共出现 6 次

注意:11 这种情况算两次

数据范围:1≤n≤30000 

进阶:空间复杂度O(1)  ,时间复杂度O(logn) 

示例:

输入:

13

返回值:

6

解题思路:

本题考察算法思维。两种解题思路:

1)按位统计法

       将数字拆解,按位数统计1出现的次数。举例说明其中的规律。

       假设数字有32134。

       分析个位数出现1的次数:由3213个10和1个4组成,每个10里面就有1个1(只看个位),而4又大于1,所以还会出现1次个位为1的数字。

       分析十位数出现1的次数:由321个100和1个34组成,每个100里面就有10个1(只看十位),从10到19,而34大于19,说明还会出现10次十位为1的数字。

       分析百位数出现1的次数:由32个1000和1个134组成,每个1000里面就有100个1(只看百位),从100到199,而134小于199,说明还会出现35次百位为1的数字,即100到134。

       基于上述规律列出每位数出现次数的公式:bitcount = n / (b * 10) * b + min(max(n % (b * 10)- b + 1, (long long)(0)), b)。

       其中n为数字,b为当前位数,下面用百位数分析举例。n / (b * 10) 计算出当前位数高一级位的数量,*b表示对应1的数量,即有32个1000,32个1000就说明有32*100个1;max(n % (b * 10)- b + 1, (long long)(0))用来判断余出来的部分134是否大于100,如果换成一个小于100的数,那就取0,大于100的数就取超出100的部分,比如134就是100到134,共35个数;后面的min,是为了对超出100的部分做限制,假设134是234,那应该100到199最多100个数而不是235个数。

       该算法时间复杂度为O(log10 n),与位数相关,常数级变量,本题的理想解法。

2)暴力循环

       循环所有数字,对每个数字的所有位数也进行循环。该算法时间复杂度为O(nlog10 n)。

测试代码:

1)按位统计法

class Solution {
public:
    // 统计1出现的次数
    int NumberOf1Between1AndN_Solution(int n) {
        int count = 0;
        long long b = 1;
        // b代表位数,从1到10到100,以此类推直到超过n
        while(b <= n){
            // 假设数字32134
            // 分析个位数出现1的次数:由3213个10和1个4组成,每个10里面就有1个1(只看个位),而4又大于1,所以还会出现1次个位为1的数字
            // 分析十位数出现1的次数:由321个100和1个34组成,每个100里面就有10个1(只看十位),从10到19,而34大于19,说明还会出现10次十位为1的数字
            // 分析百位数出现1的次数:由32个1000和1个134组成,每个1000里面就有100个1(只看百位),从100到199,而134小于199,说明还会出现35次百位为1的数字,即100到134
            // 基于上述规律,可以列出下式
            // 后半段的min和max是为了判断后面余的那部分对应位数出现次数
            count += n / (b * 10) * b + min(max(n % (b * 10)- b + 1, (long long)(0)), b);
            b *= 10;
        }
        return count;
    }
};

2)暴力循环

class Solution {
public:
    // 统计1出现的次数
    int NumberOf1Between1AndN_Solution(int n) {
        int count = 0;
        // 循环所有数字
        for(int i = 1; i <= n; ++i){
            // 循环每个数字的所有位数
            for(int j = i; j > 0; j /= 10){
                if(j % 10 == 1){
                    count++;
                }
            }
        } 
        return count;
    }
};

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

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

相关文章

Spring原理——基于xml配置文件创建IOC容器的过程

Spring框架的核心之一是IOC&#xff0c;那么我们是怎么创建出来的Bean呢&#xff1f; 作者进行了简单的总结&#xff0c;希望能对你有所帮助。 IOC的创建并不是通过new而是利用了java的反射机制&#xff0c;利用了newInstance方法进行的创建对象。 首先&#xff0c;我们先定义…

医学检验(LIS)管理系统源码,LIS源码,云LIS系统源码

医学检验(LIS)管理系统源码&#xff0c;云LIS系统全套商业源码 随着全自动生化分析仪、全自动免疫分析仪和全自动血球计数器等仪器的使用&#xff0c;检验科的大多数项目实现了全自动化分析。全自动化分析引入后&#xff0c;组合化验增多&#xff0c;更好的满足了临床需要&…

抵御网络威胁的虚拟盾牌:威胁建模

威胁建模是一个允许您管理因日益复杂且不断变化的 IT 安全威胁而产生的风险的过程。为了保护敏感系统和数据&#xff0c;主动了解和应对这些威胁至关重要。 威胁建模是识别、评估和减轻这些威胁的关键过程&#xff0c;确保组织准备好面对不断出现的新的复杂挑战。 本文将详细…

RTL8762x芯片避坑总结之1——用GPIO模拟I2C

1. 使用GPIO模拟I2C&#xff1a; 1.1 按常规逻辑 在输出第1个数据&#xff0c;切换为输入读取ACK后&#xff0c;切回输出无效&#xff0c;不能输出数据&#xff1a; 1.2 在切换输入输出前&#xff0c;需要对Pad重新进行配置 重新配置后&#xff0c;输入输出切换成功&#xf…

笔记本电脑可以投屏到电视吗?Win、Mac、Linux分别怎么投屏?

如果你的电视是安卓电视&#xff0c;那么答案是&#xff1a;完全可以&#xff01; 不管你的笔记本电脑是Windows系统、macOS系统还是Linux系统&#xff0c;你都可以借助AirDroid Cast的电脑客户端或网页版&#xff0c;将电脑屏幕投屏到安卓智能电视上。 首先&#xff0c;你需要…

数据链路层-以太网协议

目录 数据链路层的作用认识以太网以太网帧格式认识MAC地址对比理解MAC地址和IP地址认识MTUMTU对UDP协议的影响MTU对TCP协议的影响数据跨网络传输的过程ARP协议ARP协议作用ARP数据报的格式ARP协议的工作流程 数据链路层的作用 我们知道数据能在网络中从一台主机发送到另一台主机…

【Proteus仿真】【STM32单片机】智能垃圾桶设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真STM32单片机控制器&#xff0c;使用报警模块、LCD1602液晶模块、按键模块、人体红外传感器、HCSR04超声波、有害气体传感器、SG90舵机等。 主要功能&#xff1a; 系统运行后&…

极智项目 | 实战实时、多人2D人体姿态识别之OpenPose

欢迎关注我的公众号 [极智视界]&#xff0c;获取我的更多经验分享 大家好&#xff0c;我是极智视界&#xff0c;本文来介绍 实战实时、多人2D人体姿态识别之OpenPose。 本文介绍的 实战实时、多人2D人体姿态识别之OpenPose&#xff0c;提供完整的可以一键执行的项目工程源码&…

android实战项目之二十二---如何快速APP中集成支付宝和微信支付功能

效果图 实现方案 jcenter 集成方式 implementation com.xgr.easypay:EasyPay:2.0.5 // 基类库&#xff0c;必选 implementation com.xgr.easypay:wechatpay:2.0.5 // 微信支付&#xff0c;可选 implementation com.xgr.easypay:alipay:2.0.5 // 支付宝支付&#xff0c;可…

2023亚马逊云科技re:Invent引领科技新潮流:云计算与生成式AI共塑未来

2023亚马逊云科技re:Invent引领科技新潮流&#xff1a;云计算与生成式AI共塑未来 历年来&#xff0c;亚马逊云科技re:Invent&#xff0c;不仅是全球云计算从业者的年度狂欢&#xff0c;更是全球云计算领域每年创新发布的关键节点。 2023年亚马逊云科技re:Invent大会在美国拉斯…

C语言算术转换例题

这里写目录标题 例题一题目解析答案 例题二题目解析答案 例题三题目解析答案 例题四方法一解析方法二解析 例题五答案方法一方法二解析 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 &#x1f412;&#x1f412;&#x1f412; 个人主页 &#x1f978;&#…

golang panic关键词执行原理与代码分析

使用的go版本为 go1.21.2 首先我们写一个简单的panic调度与捕获代码 package mainfunc main() {defer func() {recover()}()panic("panic test") }通过go build -gcflags -S main.go获取到对应的汇编代码 可以看到当我们调度panic时&#xff0c;Go的编译器会将这段…

uniapp视频倍速播放插件,uniapp视频试看插件——sunny-video使用文档

sunny-video视频倍速播放器 组件名&#xff1a;sunny-video 效果图 img1img2img3img4 平台差异说明 目前已应用到APP&#xff08;安卓、iOS&#xff09;、微信&#xff08;小程序、H5&#xff09;其它平台未测试 安装方式 本组件符合easycom规范&#xff0c;HBuilderX 2.5…

JoyT的科研之旅第一周——科研工具学习及论文阅读收获

CiteSpace概述 CiteSpace 是一个用于可视化和分析科学文献的工具&#xff0c;它专门针对研究者进行文献回顾和趋势分析。CiteSpace 的核心功能是创建文献引用网络&#xff0c;这些网络揭示了研究领域内各个文献之间的相互关系。使用 CiteSpace 可以为论文研究做出贡献的几种方…

【迅搜03】全文检索、文档、倒排索引与分词

全文检索、文档、倒排索引与分词 今天还是概念性的内容&#xff0c;但是这些概念却是整个搜索引擎中最重要的概念。可以说&#xff0c;所有的搜索引擎就是实现了类似的概念才能称之为搜索引擎。而且今天的内容其实都是相关联的&#xff0c;所以不要以为标题上有四个名词就感觉好…

NX二次开发UF_CURVE_ask_int_parms_sc 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_ask_int_parms_sc Defined in: uf_curve.h int UF_CURVE_ask_int_parms_sc(tag_t int_curve_object, int * num_objects_set_1, tag_t * * object_set_1, int * num_object…

LeetCode Hot100 102.二叉树的层序遍历

题目&#xff1a; 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 方法&#xff1a;迭代 class Solution {public List<List<Integer>> levelOrder(TreeNode root) {if …

基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(七)

分页查询、删除和修改菜品 1. 菜品分页查询1.1 需求分析和设计1.1.1 产品原型1.1.2 接口设计 1.2 代码开发1.2.1 设计DTO类1.2.2 设计VO类1.2.3 Controller层1.2.4 Service层接口1.2.5 Service层实现类1.2.6 Mapper层 1.3 功能测试1.3.2 前后端联调测试 2. 删除菜品2.1 需求分析…

局域网协议:DNS(Domain Name System,域名系统)详解

文章目录 什么是DNS&#xff1f;DNS的重要性DNS的域名解析过程递归查询迭代查询 DNS解析失败怎么办&#xff1f;为什么DNS需要递归服务器&#xff1f;DNS为什么用UDP&#xff1f;推荐阅读 什么是DNS&#xff1f; DNS&#xff08;Domain Name System&#xff0c;域名系统&#…

【Unity3D】MAX聚合广告SDK——Pangle广告接入

Pangle, App Monetization Simplified 注册 登录 创建应用 创建广告单元 将其应用ID和广告ID关联到MAX广告。 下载Pangle Unity Plugin包&#xff0c;新建一个空工程&#xff08;很重要&#xff09; Unity版本2019.4.0f1 gradle plugin 4.2.0 gradle版本6.7.1 build_tools 34.…