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

目录

​编辑

一,问题描述

二,例子

 三,题目接口

四,题目解答

1,暴力解法

2.规律解法

总结:

代码:

 


 

 

一,问题描述

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

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

二,例子

先来看看题目的例子:

在例1中给出的n=12,那答案便是5。为什么呢?先来看看1~12之间的数字:

1,2,3,4,5,6,7,8,9,10,11,12。在这一组数字中,出现1的数字有:1,10,11,12。刚好就是5五个所以答案就是5。

 三,题目接口

class Solution {
public:int countDigitOne(int n) {}
};

四,题目解答

1,暴力解法

不得不说,暴力解法写起来特别简单。一个for循环加上一个while循环便可以了。其中for循环的作用便是用来将1~n的数字遍历,while循环的作用是求遍历进来的数的每一位上的数字是否为1。根据以上思路写出的代码如下:

class Solution {
public:int countDigitOne(int n) {int count = 0;for(int i  = 1;i<=n;i++){int j = i;while(j){if(j%10==1){count++;}j/=10;}}return count;}
};

但是,遗憾的告诉大家这个代码是过不了的。因为n可以变得很大:

 在这里将count改为long long 类型也没有用。

2.规律解法

在这里先说一下这个解法的步骤:

1.首先来定义几个变量:cur,high,cur,bit,ans。这几个变量都是一些数字。对于一个数520122,它们的对应关系如下:

 对于现在这个cur指向最低位的2时,我们可以假设cur指向的数字变成了1。对于这个最后一位为1时这个六位数有多少个组合呢?是不是有(52012+1) = (high+1)种组合啊?如下图:

现在cur往前移一位,变成下面的样子:

 

 

还是将cur指向的2变成1,这个时候对于十位上的数变成1会有多少种组合呢?

对于右边还是(5201+1)=(high+1)种。但是对于左边可不是(2+1) = (low+1)种。而是bit种。为什么呢?因为当cur指向的数字大于1时,那cur的下一位便可以变成0~9中的任何一个数字共有10种。也就是bit种。所以这里的组合有(5201+1)*10 =(high+1)*bit种。

       接下来再次移动cur,如下图:

 这时对于cur指向的数字为1时的搭配便是520*100+(22+1) = high*bit+(low+1)种了。

因为cur指向的是数字1,所以为了保证搭配成的组合数比n小。high指向的组合可以分为两种情况。1,high取到了520,那此时low只能取:00~22。2.当high取到:000~519这520种情况时,那low可以取:00~99共100种,也就是bit种。

    现在继续移动cur:

此时cur指向的数字变成了0。若要让该位置上的数字变成1并且让得到的数字比n小,那high就只能取到:00~51共52个数,在取这52个数是low是没有限制的,所以low可以取到0~999的数字。所以当cur位为1时共有52*1000 =high*bit种搭配。 

总结:

求到这时规律已经出现:

cur>1共有:(high+1)*bit种

cur = 1共有:hight*bit+(low+1)种

cur = 0共有:hight*bit种

并且:

cur = (n/bit)%10

low = n%bit

hight = n/bit/10。

代码:

class Solution {
public:int countDigitOne(int n) {long long sum = 0;long long bit = 1;while(bit<=n){long long cur = (n/bit)%10;long long low = n%bit;long long high = n/bit/10;if(cur == 0){sum+=high*bit;}else if(cur == 1){sum+=high*bit+(low+1);}else{sum+=(high+1)*bit;}bit*=10;}return sum;}
};

 

 

 

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

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

相关文章

2023高教社杯数学建模思路 - 复盘:人力资源安排的最优化模型

文章目录 0 赛题思路1 描述2 问题概括3 建模过程3.1 边界说明3.2 符号约定3.3 分析3.4 模型建立3.5 模型求解 4 模型评价与推广5 实现代码 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 描述 …

1. 卷积原理

① 卷积核不停的在原图上进行滑动&#xff0c;对应元素相乘再相加。 ② 下图为每次滑动移动1格&#xff0c;然后再利用原图与卷积核上的数值进行计算得到缩略图矩阵的数据&#xff0c;如下图右所示。 import torch import torch.nn.functional as Finput torch.tensor([[1, 2…

mysql并行效率提升

下面是一个并行读取mysql数据库表的测试程序&#xff0c;测试结果发现&#xff0c;读取10个表&#xff0c;1个个读取&#xff0c;和并行读取10个&#xff0c;效率一样&#xff0c;甚至并行读取还慢很多&#xff0c;这是为什么&#xff1f; con get_db_conn() results {} poo…

布隆过滤器

目录 初识布隆过滤器使用布隆过滤器布隆过滤器如何实现布隆过滤器使用场景布隆过滤器存在问题解决策略 初识布隆过滤器 布隆过滤器&#xff08;Bloom Filter&#xff09;是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一…

具有优异导电性能且抑制了准饱和效应的1200V 4H-SiC沟槽MOSFET

标题&#xff1a;1200V 4H-SiC trench MOSFET with superior figure of merit and suppressed quasi-saturation effect 摘要 本文提出一种具有部分被埋层n区包围的p屏蔽区的优异性能(FoM)1200V 4H-SiC沟槽MOSFET。在准饱和(QS)状态下&#xff0c;埋层n区抑制由p屏蔽区形成的耗…

异地访问Oracle数据库的解决方案:利用内网穿透实现PL/SQL远程连接的建议与步骤

文章目录 前言1. 数据库搭建2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射 3. 公网远程访问4. 配置固定TCP端口地址4.1 保留一个固定的公网TCP端口地址4.2 配置固定公网TCP端口地址4.3 测试使用固定TCP端口地址远程Oracle ​ 小月糖糖主页 在强者的眼中&#xff0c;没有最…

【C++】特殊类的设计

特殊类的设计 前言正式开始设计一个类&#xff0c;不能被拷贝设计一个类&#xff0c;只能在堆上创建对象设计一个类&#xff0c;只能在栈上创建对象设计一个类&#xff0c;不能被继承设计一个类&#xff0c;只能创建一个对象(单例模式)饿汉模式懒汉模式总结 前言 点进来的同学…

农村农产品信息展示网站的设计与实现(论文+源码)_kaic

摘 要 随着软件技术的迅速发展,农产品信息展示的平台越来越多,传统的农产品显示方法将被计算机图形技术取代。这种网站技术主要把农产品的描述、农产品价格、农产品图片等内容&#xff0c;通过计算机网络的开发技术&#xff0c;在互联网上进行展示&#xff0c;然后通过计算机网…

Little Kernel代码学习笔记

目录 虚拟地址转换为物理地址内核启动Multiboot头部结构启动时的寄存器状态real_start段选择子初始化BSS段 页表转换设置CR4、CR3、EFER寄存器设置页表映射 初始化IDT&#xff0c;执行lk_main 虚拟地址转换为物理地址 // start.S#define PHYS_LOAD_ADDRESS (MEMBASE KERNEL_L…

多功能租车平台微信小程序源码 汽车租赁平台源码 摩托车租车平台源码 汽车租赁小程序源码

多功能租车平台微信小程序源码是一款用于汽车租赁的平台程序源码。它提供了丰富的功能&#xff0c;可以用于租赁各种类型的车辆&#xff0c;包括汽车和摩托车。 这个小程序源码可以帮助用户方便地租赁车辆。用户可以通过小程序浏览车辆列表&#xff0c;查看车辆的详细信息&…

npm 卸载 vuecli后还是存在

运行了npm uninstall vue-cli -g&#xff0c;之后是up to date in&#xff0c;然后vue -V&#xff0c;版本号一直都在&#xff0c;说明没有卸载掉 1、执行全局卸载命令 npm uninstall vue-cli -g 2、删除vue原始文件 查看文件位置&#xff0c;找到文件删掉 where vue 3、再…

[Go版]算法通关村第十三关黄金——数字数学问题之数论问题(最大公约数、素数、埃氏筛、丑数)

目录 题目&#xff1a;辗转相除法&#xff08;求最大公约数&#xff09;思路分析&#xff1a;辗转相除法&#xff08;也叫欧几里得算法&#xff09;gcd(a,b) gcd(b,a mod b)复杂度&#xff1a;时间复杂度 O ( n l o g ( m a x ) ) O(nlog(max)) O(nlog(max))、空间复杂度 O (…

探索pytest:Python自动化测试的新境界

在当今的软件开发领域&#xff0c;测试已经不仅仅是一个简单的步骤&#xff0c;而是确保软件质量的核心环节。Python&#xff0c;作为全球最受欢迎的编程语言之一&#xff0c;拥有丰富的测试框架和工具。而在这其中&#xff0c;pytest无疑是最受欢迎和最具影响力的一个。本文将…

ICS PA1

ICS PA1 init.shmake 编译加速ISA计算机是个状态机程序是个状态机准备第一个客户程序parse_argsinit_randinit_loginit_meminit_isa load_img剩余的初始化工作运行第一个客户程序调试&#xff1a;零断点TUI 基础设施单步执行打印寄存器状态扫描内存 表达式求值词法分析递归求值…

Go的基础运行方式和打包

目录 基础运行方式导入路径 打包技巧相关知识点 基础运行方式 // 文件名可以不是main&#xff0c;但包名和入口函数比如是main // main.go package main // 导入包的时候可以直接导入&#xff0c;也可以导入后指定包名&#xff0c; import ("fmt"godemo "githu…

Android学习之路(10) setContentView详解

一、简介 setContentView我们在Activity中经常见到&#xff0c;它的作用就是把我们的布局文件放在Activity中显示&#xff0c;下面我们根据源码分析setContentView是如何做到的 二、源码分析 1.两种setContentView 注意Activity的setContentView和AppCompatActivity的setCo…

斯坦福人生设计课——简略笔记

来源&#xff1a;⽐尔博内特 戴夫伊万斯 著图书《人生设计课》 目录 一、认清当下的情况&#xff0c;从四个维度观察自己的人生 二、平衡人生&#xff0c;但不要走入误区 2.1 记录你的“美好时光日志”&#xff1a; 2.1.1 记录内容&#xff1a; 2.1.2 辅助反思的方法&…

WebRTC音视频通话-iOS端调用ossrs直播拉流

WebRTC音视频通话-iOS端调用ossrs直播拉流 之前实现iOS端调用ossrs服务&#xff0c;文中提到了推流。没有写拉流流程&#xff0c;所以会用到文中的WebRTCClient。请详细查看&#xff1a;https://blog.csdn.net/gloryFlow/article/details/132262724 一、iOS播放端拉流效果 二…

强训第40天

选择 A 在域名解析之前&#xff0c;需要先与访问域名服务器&#xff0c;与域名服务器之间的网络通信需要涉及相邻设备之间的数据传输。也就是ARP&#xff0c;所以ARP是第一个 B C D 可靠传输的基础是确认应答以及超时重传。这俩是通过序号和确认序号交付的 A B 对用户是不透明的…

Rust之自动化测试(一):如何编写测试

开发环境 Windows 10Rust 1.71.1 VS Code 1.81.1 项目工程 这里继续沿用上次工程rust-demo 编写自动化测试 Edsger W. Dijkstra在他1972年的文章《谦逊的程序员》中说&#xff0c;“程序测试可以是一种非常有效的方法来显示错误的存在&#xff0c;但它对于显示它们的不存在…