数据结构学习 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

相关文章

重新对Java的类加载器的学习方式

《重新对Java的类加载器的学习方式》:本文主要介绍重新对Java的类加载器的学习方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍1.1、简介1.2、符号引用和直接引用1、符号引用2、直接引用3、符号转直接的过程2、加载流程3、类加载的分类3.1、显示

PostgreSQL 序列(Sequence) 与 Oracle 序列对比差异分析

《PostgreSQL序列(Sequence)与Oracle序列对比差异分析》PostgreSQL和Oracle都提供了序列(Sequence)功能,但在实现细节和使用方式上存在一些重要差异,... 目录PostgreSQL 序列(Sequence) 与 oracle 序列对比一 基本语法对比1.1 创建序

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

Python实现特殊字符判断并去掉非字母和数字的特殊字符

《Python实现特殊字符判断并去掉非字母和数字的特殊字符》在Python中,可以通过多种方法来判断字符串中是否包含非字母、数字的特殊字符,并将这些特殊字符去掉,本文为大家整理了一些常用的,希望对大家... 目录1. 使用正则表达式判断字符串中是否包含特殊字符去掉字符串中的特殊字符2. 使用 str.isa

C#数据结构之字符串(string)详解

《C#数据结构之字符串(string)详解》:本文主要介绍C#数据结构之字符串(string),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录转义字符序列字符串的创建字符串的声明null字符串与空字符串重复单字符字符串的构造字符串的属性和常用方法属性常用方法总结摘

使用PyTorch实现手写数字识别功能

《使用PyTorch实现手写数字识别功能》在人工智能的世界里,计算机视觉是最具魅力的领域之一,通过PyTorch这一强大的深度学习框架,我们将在经典的MNIST数据集上,见证一个神经网络从零开始学会识... 目录当计算机学会“看”数字搭建开发环境MNIST数据集解析1. 认识手写数字数据库2. 数据预处理的

java字符串数字补齐位数详解

《java字符串数字补齐位数详解》:本文主要介绍java字符串数字补齐位数,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java字符串数字补齐位数一、使用String.format()方法二、Apache Commons Lang库方法三、Java 11+的St

C++从序列容器中删除元素的四种方法

《C++从序列容器中删除元素的四种方法》删除元素的方法在序列容器和关联容器之间是非常不同的,在序列容器中,vector和string是最常用的,但这里也会介绍deque和list以供全面了解,尽管在一... 目录一、简介二、移除给定位置的元素三、移除与某个值相等的元素3.1、序列容器vector、deque

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操