《剑指offer第二版》题44:找寻数字序列中某一位的数字笔记记录

2024-05-04 07:38

本文主要是介绍《剑指offer第二版》题44:找寻数字序列中某一位的数字笔记记录,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目:

数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。请写一个函数,求任意第n位对应的数字。题目链接

1.解题步骤

解题步骤主要分为三步:

①求出第n位对应的数number的位数

②求出第n位对应的数number

③求出第n位对应数number的哪一个数字

2.数字,位数,位数数量之间的关系

通过列表格的形式来找到这几个关键点之间的联系:

数字范围位数digit数字数量位数数量count
1-9199
10-99290180
100-99939002700
start-endn9 x start9 x start x end

通过表格就可以看出第n位和位数数量之间存在范围关系:如果1<n<9,说明number位数为1位,如果9<n<189(180+9,n为累加),说明number位数为2位,以此类推。所以可以通过判断n的大小范围,得到位数。

3. 确定位数digit的代码实现

digit, start, count = 1, 1, 9
while n > count:n -= countdigit += 1start *= 10count = 9 *start * digit

通过while循环得到的digit就是第n位对应的数字number的位数。

4.确定对应的数字number的代码实现

number = start + (n-1) // digit

start对应的就是位数为digit的第一个数字,只要确定number是start开始的第几个数字,就能确定number的值。注意:while循环结束后的n已经为从start开始计算的下标

number(每一格表示一位)10111213
n12345678
n-101234567
(n-1)//digit00112233

 

(n-1)//digit刚好表示了自strat开始的第几个数字。

5. 确定n表示number的第几个数字代码实现

巧妙点:通过将number字符串化,使得number每一位都有了位置下标可以直接寻找到

sing = str(number)
res = int(sing[(n-1) % digit])

6.整体代码

class Solution:def findNthDigit(self, n: int) -> int:digit, start, count = 1, 1, 9while n > count:n -= countdigit += 1start *= 10count = 9 * start * digitnum = start + (n-1) // digitsing = str(num)res = int(sing[(n-1)%digit])return res

 

 

这篇关于《剑指offer第二版》题44:找寻数字序列中某一位的数字笔记记录的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/958672

相关文章

docker编写java的jar完整步骤记录

《docker编写java的jar完整步骤记录》在平常的开发工作中,我们经常需要部署项目,开发测试完成后,最关键的一步就是部署,:本文主要介绍docker编写java的jar的相关资料,文中通过代... 目录all-docker/生成Docker打包部署文件配置服务A的Dockerfile (a/Docke

MySQL使用EXISTS检查记录是否存在的详细过程

《MySQL使用EXISTS检查记录是否存在的详细过程》EXISTS是SQL中用于检查子查询是否返回至少一条记录的运算符,它通常用于测试是否存在满足特定条件的记录,从而在主查询中进行相应操作,本文给大... 目录基本语法示例数据库和表结构1. 使用 EXISTS 在 SELECT 语句中2. 使用 EXIS

Python的Darts库实现时间序列预测

《Python的Darts库实现时间序列预测》Darts一个集统计、机器学习与深度学习模型于一体的Python时间序列预测库,本文主要介绍了Python的Darts库实现时间序列预测,感兴趣的可以了解... 目录目录一、什么是 Darts?二、安装与基本配置安装 Darts导入基础模块三、时间序列数据结构与

C# LiteDB处理时间序列数据的高性能解决方案

《C#LiteDB处理时间序列数据的高性能解决方案》LiteDB作为.NET生态下的轻量级嵌入式NoSQL数据库,一直是时间序列处理的优选方案,本文将为大家大家简单介绍一下LiteDB处理时间序列数... 目录为什么选择LiteDB处理时间序列数据第一章:LiteDB时间序列数据模型设计1.1 核心设计原则

Python学习笔记之getattr和hasattr用法示例详解

《Python学习笔记之getattr和hasattr用法示例详解》在Python中,hasattr()、getattr()和setattr()是一组内置函数,用于对对象的属性进行操作和查询,这篇文章... 目录1.getattr用法详解1.1 基本作用1.2 示例1.3 原理2.hasattr用法详解2.

基于Python实现数字限制在指定范围内的五种方式

《基于Python实现数字限制在指定范围内的五种方式》在编程中,数字范围限制是常见需求,无论是游戏开发中的角色属性值、金融计算中的利率调整,还是传感器数据处理中的异常值过滤,都需要将数字控制在合理范围... 目录引言一、基础条件判断法二、数学运算巧解法三、装饰器模式法四、自定义类封装法五、NumPy数组处理

基于Spring Boot 的小区人脸识别与出入记录管理系统功能

《基于SpringBoot的小区人脸识别与出入记录管理系统功能》文章介绍基于SpringBoot框架与百度AI人脸识别API的小区出入管理系统,实现自动识别、记录及查询功能,涵盖技术选型、数据模型... 目录系统功能概述技术栈选择核心依赖配置数据模型设计出入记录实体类出入记录查询表单出入记录 VO 类(用于

Linux中的自定义协议+序列反序列化用法

《Linux中的自定义协议+序列反序列化用法》文章探讨网络程序在应用层的实现,涉及TCP协议的数据传输机制、结构化数据的序列化与反序列化方法,以及通过JSON和自定义协议构建网络计算器的思路,强调分层... 目录一,再次理解协议二,序列化和反序列化三,实现网络计算器3.1 日志文件3.2Socket.hpp

java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)

《java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)》:本文主要介绍java中pdf模版填充表单踩坑的相关资料,OpenPDF、iText、PDFBox是三... 目录准备Pdf模版方法1:itextpdf7填充表单(1)加入依赖(2)代码(3)遇到的问题方法2:pd

Spring的RedisTemplate的json反序列泛型丢失问题解决

《Spring的RedisTemplate的json反序列泛型丢失问题解决》本文主要介绍了SpringRedisTemplate中使用JSON序列化时泛型信息丢失的问题及其提出三种解决方案,可以根据性... 目录背景解决方案方案一方案二方案三总结背景在使用RedisTemplate操作redis时我们针对