跟着姚桑学算法-数字序列中某一位的数字

简介: 剑指offer算法

题. 数字序列中某一位的数字

数字以 0123456789101112131415… 的格式序列化到一个字符序列中。

在这个序列中,第 5 位(从 0 开始计数)是 5,第 13 位是 1,第 19 位是 4,等等。

请写一个函数求任意位对应的数字。

数据范围
0≤ 输入数字 ≤2147483647

样例

输入:13

输出:1

【题解】--- 模拟

模拟一个实例,n = 1022,匹配到的数是377,对应它的第2位,也就是3后面的那个7,输出ans是7。

  1. 首先不断地对1022进行处理,也就是第1个while()循环做的事情,得到base = 100, i = 3, n = 833。那么得到的信息就是1022位数处于3位数的区间,那一位从100开始数,是第833位。
  2. 第二步,我们就可以通过100和3和833这三个信息推出1022位数字,具体落脚在了哪个3位数上。
  3. 我们来逆推下公式,比如377这个数,(377−100+1)∗3(377−100+1)∗3得到的就是100到377有多少位数字,结果是834。
  4. 我们上面求出的n是833,834指的是377最后一位的位数。所以为了求出377,我们通过(n + (i - 1)) / i,从而求出来它具体在第几位。然后得出在100后面的第278位,最后(278 + 100 - 1) = 377。
  5. 得到number后,我们通过 833 % i的结果,如果能除尽,就是number的最后一位,也就是i位;不然就是number中从第1位算起的第n % i位(下标从1开始哦)。
  6. 算出来r是2后,说明是377的第2位,也就是第1个7,我们让它除10,一次,除10的次数是[0 ~ i - r)
  7. 处理后的number的个位就是要求的答案,我们返回的时候number %10就ok。

复杂度分析:

1. 确定寻找的n处于几位数的范畴,1位数,2位数,还是3位数....这里的时度是O(1)。
2. 确定是i位数后,确定是i位数中的哪个,比如说4位数的第256个数,1000 + 256 - 1 = 1255,1255就是4位数的其中1个。
这里的时度是O(1),用到了除法。
3. 确定是哪个数以后(比如确定是1255这个数以后),看看数字n是这个数的第几位,拿1255来举例子,是1还是2还是5还是5。
这里是取余,时度是O(1)的,然后取出来是哪一位数,最多是10位,所以最多是10次操作,时间复杂度为O(log10n)。

C++代码实现:

class Solution {
public:
    int pow10(int x){
        int res=1;
        for(int i=0;i<x;i++){
            res*=10;
        }
        return res;
    }
    int digitAtIndex(int n) {
        if(n<10){
            return n;
        }

        int m=n-9;
        long long k=2;
        while(m>9*k*pow10(k-1)){
            m-=9*k*pow10(k-1);
            k++;
        }
        //t---第t个k位数
        int t=m/k;
        int s=m%k;
        int num=pow10(k-1);
        num+=t;
        if(s==0){
            return (num-1)%10;
        }
        else{
            for(int i=0;i<k-s;i++){
                num/=10;
            }
            return num%10;
        }
    }
};
目录
相关文章
|
2月前
|
存储 算法 索引
模拟算法题练习(二)(DNA序列修正、无尽的石头)
模拟算法题练习(二)(DNA序列修正、无尽的石头)
|
5月前
|
设计模式 算法 Java
【数据结构和算法】递增的三元子序列
给你一个整数数组nums,判断这个数组中是否存在长度为3的递增子序列。 如果存在这样的三元组下标(i, j, k)且满足i < j < k,使得nums[i] < nums[j] < nums[k],返回true;否则,返回false。
56 3
|
5月前
|
算法
class072 最长递增子序列问题与扩展【算法】
class072 最长递增子序列问题与扩展【算法】
26 0
|
3月前
|
编解码 算法 定位技术
GEE时序——利用sentinel-2(哨兵-2)数据进行地表物候学分析(时间序列平滑法估算和非平滑算法代码)
GEE时序——利用sentinel-2(哨兵-2)数据进行地表物候学分析(时间序列平滑法估算和非平滑算法代码)
89 3
|
5月前
|
算法
排序置顶、非置顶算法,实现置顶后的结果和非置顶的内容排序保持原始序列
排序置顶、非置顶算法,实现置顶后的结果和非置顶的内容排序保持原始序列
|
12天前
|
机器学习/深度学习 人工智能 运维
人工智能平台PAI 操作报错合集之请问Alink的算法中的序列异常检测组件,是对数据进行分组后分别在每个组中执行异常检测,而不是将数据看作时序数据进行异常检测吧
阿里云人工智能平台PAI (Platform for Artificial Intelligence) 是阿里云推出的一套全面、易用的机器学习和深度学习平台,旨在帮助企业、开发者和数据科学家快速构建、训练、部署和管理人工智能模型。在使用阿里云人工智能平台PAI进行操作时,可能会遇到各种类型的错误。以下列举了一些常见的报错情况及其可能的原因和解决方法。
|
13天前
|
算法 数据安全/隐私保护 数据格式
基于混沌序列的图像加解密算法matlab仿真,并输出加解密之后的直方图
该内容是一个关于混沌系统理论及其在图像加解密算法中的应用摘要。介绍了使用matlab2022a运行的算法,重点阐述了混沌系统的特性,如确定性、非线性、初值敏感性等,并以Logistic映射为例展示混沌序列生成。图像加解密流程包括预处理、混沌序列生成、数据混淆和扩散,以及密钥管理。提供了部分核心程序,涉及混沌序列用于图像像素的混淆和扩散过程,通过位操作实现加密。
|
14天前
|
编解码 算法 数据可视化
【视频】时间序列分类方法:动态时间规整算法DTW和R语言实现
【视频】时间序列分类方法:动态时间规整算法DTW和R语言实现
|
1月前
|
存储 算法
从动态规划到贪心算法:最长递增子序列问题的方法全解析
从动态规划到贪心算法:最长递增子序列问题的方法全解析
105 2
|
3月前
|
算法 测试技术 C++
【动态规划】【C++算法】801. 使序列递增的最小交换次数
【动态规划】【C++算法】801. 使序列递增的最小交换次数