剑指 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';
}
}
复杂度分析
- 时间复杂度 O(logn) : 所求数位 n 对应数字 num 的位数 digit 最大为 O(logn) ;第一步最多循环 O(logn) 次;第三步中将 num 转化为字符串使用 O(logn) 时间;因此总体为 O(logn) 。
- 空间复杂度 O(logn) : 将数字 num 转化为字符串 str(num) ,占用 O(logn) 的额外空间。
Either Excellent or Rusty