数据结构学习 jz44 数字序列中某一位的数字

2024-01-15 14:20

本文主要是介绍数据结构学习 jz44 数字序列中某一位的数字,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

关键词:找规律 数学

题目:LCR 163. 找到第 k 位数字

虽然做出来了但是做了十万年,我是猪。主要还是找到准确的规律。

思路:

    //找规律

    //0-9 占了10个位置

    //10-99 占了90*2个位置

    //100-999 占了900*3个位置

    //1000-9999 占了9000*4个位置

总体求解顺序:

        1、 确定要求的数字的位数

        2、再确定数字

        3、再确定要求的数字的第b位

比如:

k==479

        1、 确定要求的数字的位数

                479-10-90*2=289>0 说明大于99

                479-10-90*2-900*3=-2411<0 说明小于999

                可以确定要求的数y是i=2位数,y在100-999区间内,这个区间的每个数都得占3个字符。

                并且说明y里我们要求的res排在100-999这个区间里的第289个字符。

        long long x=k;//注意这里不能用int 会爆long long rex = 1;//10 100 1000int i = 1;//存位数while (x >= 0)//确定位数:一点一点减,减到合适的位置 x=x-9*10^(i-1)*i{rex *= 10;i++;x = x - (rex*9) * i;//479-10-90*2-900*3=-2411}x = x + (rex * 9) * i;//479-10-90*2=289

        2、再确定数字是几

                在100-999这个区间内每个数都得占3个字符。

                a=x/i:a=289/2=96,y排在100-999这个区间里的第96个数字。

                为什么/i?因为这个区间一个数字由i个字符组成

                得到a和i,现在我们已经可以确定y了:a加上这个区间的最小数rex=100 即y=rex+a=100+96=196

long long a = x / i;//a=x/i:a=289/2=96,y排在100-999这个区间里的第96个数字//为什么/i?因为这个区间一个数字由i个字符组成
long long res = rex + a;//现在我们已经可以确定y了:a加上这个区间的最小数rex=100 即y=rex+a=100+96=196

        3、再确定要求的数字的第b位

                确定我们要求的数字在y里的位置:b = x % i=1。

                //因为求的是从左往右数的第b位,而不是我们习惯的从右往左数,所以要除的10的个数是i-b-2

                //比如1234,b是2,那么得除两次10,即i-b-2=4-2-1=1 j=<1 除了两次10

                最后求模,得到个位数,就是我们需要的。

        long long b = x % i;//还需要确定我们要求的数字在y里的位置:b = x % i=1//因为求的是从左往右数的第b位,而不是我们习惯的从右往左数,所以要除的10的个数是i-b-2//比如1234,b是2,那么得除两次10,即i-b-2=4-2-1=1 j=<1 除了两次10for(int j=0;j<=i-b-2;j++){res=res/10;}res=res%10;//求模

复杂度计算:

时间复杂度O(logk) 确定位数

空间复杂度O(1) 只用了常数个空间没有开辟新的空间存别的

代码:

class Solution {
public://找规律//0-9 占了10个位置//10-99 占了90*2个位置//100-999 占了900*3个位置//1000-9999 占了9000*4个位置//可以先确定要求的数字的位数,再确定数字,再确定要求的数字的第b位//比如:k==479//479-10-90*2=289>0 479-10-90*2-900*3=-2411<0 可以确定要求的数y是i=2位数//说明y里我们要求的res排在100-999这个区间里的第289个字符//a=x/i:a=289/2=96,y排在100-999这个区间里的第96个数字//为什么/i?因为这个区间一个数字由i个字符组成//现在我们已经可以确定y了:a加上这个区间的最小数rex=100 即y=rex+a=100+96=196//还需要确定我们要求的数字在y里的位置:b = x % i=1//因为求的是从左往右数的第b位,而不是我们习惯的从右往左数,所以要除的10的个数是i-b-2//比如1234,b是2,那么得除两次10,即i-b-2=4-2-1=1 j=<1 除了两次10//最后求模就可以啦int findKthNumber(int k) {if (k < 10) return k;k = k - 10;long long x=k;//注意这里不能用int 会爆long long rex = 1;//10 100 1000int i = 1;//存位数while (x >= 0)//确定位数:一点一点减,减到合适的位置 x=x-9*10^(i-1)*i{rex *= 10;i++;x = x - (rex*9) * i;//479-10-90*2-900*3=-2411}x = x + (rex * 9) * i;//479-10-90*2=289long long a = x / i;//a=x/i:a=289/2=96,y排在100-999这个区间里的第96个数字//为什么/i?因为这个区间一个数字由i个字符组成long long b = x % i;//还需要确定我们要求的数字在y里的位置:b = x % i=1long long res = rex + a;//现在我们已经可以确定y了:a加上这个区间的最小数rex=100 即y=rex+a=100+96=196//因为求的是从左往右数的第b位,而不是我们习惯的从右往左数,所以要除的10的个数是i-b-2//比如1234,b是2,那么得除两次10,即i-b-2=4-2-1=1 j=<1 除了两次10for(int j=0;j<=i-b-2;j++){res=res/10;}res=res%10;//求模return res;}
};

这篇关于数据结构学习 jz44 数字序列中某一位的数字的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

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

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

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

redis数据结构之String详解

《redis数据结构之String详解》Redis以String为基础类型,因C字符串效率低、非二进制安全等问题,采用SDS动态字符串实现高效存储,通过RedisObject封装,支持多种编码方式(如... 目录一、为什么Redis选String作为基础类型?二、SDS底层数据结构三、RedisObject

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

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

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

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

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

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

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

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

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

利用Python实现时间序列动量策略

《利用Python实现时间序列动量策略》时间序列动量策略作为量化交易领域中最为持久且被深入研究的策略类型之一,其核心理念相对简明:对于显示上升趋势的资产建立多头头寸,对于呈现下降趋势的资产建立空头头寸... 目录引言传统策略面临的风险管理挑战波动率调整机制:实现风险标准化策略实施的技术细节波动率调整的战略价