• 每日一题


    题目信息

    • 时间: 2019-07-01

    • 题目链接:Leetcode

    • tag: 规律

    • 难易程度:中等

    • 题目描述:

      数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。

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

    示例1:

    输入:n = 3
    输出:3
    

    示例2:

    输入:n = 11
    输出:0
    

    提示

    1. 0 <= n < 2^31
    

    解题思路

    本题难点

    0<n<9时,第n位对应的数字为n。n>9时,需要确定n对应的数字的位数,再确定n对应的数字,最后确定n对应数字的哪一位上。

    具体思路

    1. 将 101112⋯ 中的每一位称为 数位 ,记为 n;

    2. 将 10,11,12,⋯ 称为 数字 ,记为 num ;

    3. 数字 10是一个两位数,称此数字的 位数 为 2 ,记为 digit;

    4. 每 digit 位数的起始数字(即:1,10,100,⋯),记为 start 。

      数字范围 位数 数字数量 数位数量
      1~9 1 9 9
      10~99 2 90 180
      100~999 3 900 2700
      ... ... ... ...
      start~end digit 9*start 9* start * digit

    求解步骤:

    • 确定 n所在 数字位数 ,记为 digit ;
    • 确定 n所在的 数字 ,记为 num ;
    • 确定 n是 num中的哪一数位,并返回结果。

    代码

    class Solution {
        public int findNthDigit(int n) {
            int digit = 1;
            long start =1;
            long count = 9;
          //确定所求数位的所在数字的位数
            while(n > count){
                n -= count;
                digit += 1;
                start *= 10;
                count = digit * start * 9; 
            }
          // 确定所求数位所在的数字
            long num = start + (n -1) / digit;
          //确定所求数位在 num 的哪一数位
            return Long.toString(num).charAt((n-1)%digit) - '0';
        }
    }
    

    复杂度分析:

    • 时间复杂度 O(logn) : 所求数位 n 对应数字 num 的位数 digit 最大为 O(logn) ;第一步最多循环 O(logn) 次;第三步中将 num 转化为字符串使用 O(logn) 时间;因此总体为 O(logn) 。
    • 空间复杂度 O(logn) : 将数字 num 转化为字符串 str(num) ,占用 O(log⁡n)的额外空间。
  • 相关阅读:
    linux命令备忘
    java搭建finagle(2)
    记一次Time-Wait导致的问题
    读loadBalance技术的一些笔记
    Immutable.js尝试(node.js勿入)
    python flask 部署
    一个奇怪的html上url参数问题
    xxx-servlet.xml vs applicationContext.xml
    大数据环境安装部署步骤
    数据迁移
  • 原文地址:https://www.cnblogs.com/ID-Wangqiang/p/13233462.html
Copyright © 2020-2023  润新知