剑指 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 描述 …

异侠的CSDN笔记目录

文章目录 B站雷神B站黑马其他零散记录MyBatis 及其 Plus常用工具类线程 & 网络编程过滤器监听器Listener会话Session异步请求 AJAX B站雷神 基础知识 如何创建项目 快速创建项目 自动配置原理 容器功能 小技巧 yaml用法 web开发简单功能 数据响应与内容协商模板引擎 …

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…

2023.8 - java - 数组

声明数组变量 首先必须声明数组变量&#xff0c;才能在程序中使用数组。下面是声明数组变量的语法&#xff1a; dataType[] arrayRefVar; // 首选的方法或dataType arrayRefVar[]; // 效果相同&#xff0c;但不是首选方法int[] a {1,2,3};int b[] new int[10];TS:let a:…

布隆过滤器

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

【排序】快排的优化(三数取中)

三数取中 就是将整个数组分为两半&#xff0c;三个数&#xff08;头、尾、中间&#xff09;的第二大的数字和 left 位置的数字相交换&#xff0c;可以避免排一个有序的数组从而出现单分支树的情况。 如果每次都找了一个最小的值作为基准值&#xff0c;那就会导致这个结点没有左…

具有优异导电性能且抑制了准饱和效应的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屏蔽区形成的耗…

IPD流程中,TR2评审的内容、评审标准和评审要素

在IPD&#xff08;Integrated Product Development&#xff09;流程中&#xff0c;TR2&#xff08;Technical Review 2&#xff09;评审是项目开发过程中的一个重要里程碑评审&#xff0c;通常在项目的中期进行。TR2评审的目的是对项目的技术进展和实施情况进行评估和审查&…

异地访问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;只能创建一个对象(单例模式)饿汉模式懒汉模式总结 前言 点进来的同学…

c++ 学习之函数的默认参数

当在C中使用默认参数时&#xff0c;你可以在函数声明中为一个或多个参数指定默认值。这允许你在调用函数时&#xff0c;如果没有为这些参数提供实际值&#xff0c;编译器会使用你提供的默认值。这样可以在不同的情况下使用同一个函数&#xff0c;避免编写多个函数重载。 以下是…

第十一章 CUDA的NMS算子实战篇(上篇)

cuda教程目录 第一章 指针篇 第二章 CUDA原理篇 第三章 CUDA编译器环境配置篇 第四章 kernel函数基础篇 第五章 kernel索引(index)篇 第六章 kenel矩阵计算实战篇 第七章 kenel实战强化篇 第八章 CUDA内存应用与性能优化篇 第九章 CUDA原子(atomic)实战篇 第十章 CUDA流(strea…

农村农产品信息展示网站的设计与实现(论文+源码)_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、再…

《基于 Vue 组件库 的 Webpack5 配置》6.将字体库和图片等静态资料,编译后打包至指定文件夹

参考 Rule.generator.filenamepackage.json 的配置如下 module.exports {module: {{test: /\.(png|svg|jpg|jpeg|gif)$/i,type: asset/resource,generator: {// publicPath: assets/imgs/, // filename: imgs/[hash][ext],}},{test: /\.(woff|woff2|eot|ttf|otf)$/i,type: as…

菜鸟教程《Python 3 教程》笔记(1):基本数据类型

菜鸟教程《Python 3 教程》笔记&#xff08;1&#xff09;&#xff1a;基本数据类型 1 基本数据类型1.1 Number&#xff08;数字&#xff09;1.2 String&#xff08;字符串&#xff09;1.3 bool&#xff08;布尔类型&#xff09;1.4 List&#xff08;列表&#xff09;1.5 Tuple…

[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 (…