剑指 Offer 44. 数字序列中某一位的数字 + 找规律 + 数位

剑指 Offer 44. 数字序列中某一位的数字

Offer_44

题目描述

题解分析

java代码

package com.walegarrett.offer;

/**
 * @Author WaleGarrett
 * @Date 2021/2/8 10:01
 */

/**
 * 题目描述:
 * 数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。
 * 请写一个函数,求任意第n位对应的数字。
 */
public class Offer_44 {
    public int findNthDigit(int n) {
        int digital = 1;//数字是多少位数
        long start = 1;//每种位数开始的数字是什么
        long count = 9;//每种位数的数字
        while(n>count){
            n-=count;
            digital += 1;
            start *= 10;
            count = 9 * digital * start;
        }
        long num = start + (n-1) /digital;
        int index = (n-1)%digital;
        return Long.toString(num).charAt(index) - '0';
    }
}

复杂度分析

  1. 时间复杂度 O(logn) : 所求数位 n 对应数字 num 的位数 digit 最大为 O(logn) ;第一步最多循环 O(logn) 次;第三步中将 num 转化为字符串使用 O(logn) 时间;因此总体为 O(logn) 。
  2. 空间复杂度 O(logn) : 将数字 num 转化为字符串 str(num) ,占用 O(logn) 的额外空间。
posted @ 2021-02-08 16:33  Garrett_Wale  阅读(96)  评论(0编辑  收藏  举报