剑指offer36 JZ44 数字序列中某一位的数字
数字序列中某一位的数字
https://www.nowcoder.com/practice/29311ff7404d44e0b07077f4201418f5?tpId=13&tqId=2285751&ru=/exam/oj/ta&qru=/ta/coding-interviews/question-ranking&sourceUrl=%2Fexam%2Foj%2Fta%3Fpage%3D1%26tpId%3D13%26type%3D13
// 0
// 1 ~ 9 | digit = 1 start = 1 * 1 count = 1 * 9 * 1
// 10 ~ 99 | digit = 2 start = 1 * 10 count = 10 * 9 * 2
// 100 ~ 999 | digit = 3 start = 1 * 10 * 10 count = 100 * 9 * 3
-
锁定位数对应区间(减去前面的所有位数)
-
找到区间对应的那个数字
-
找到目标位数对应目标数字对应的下标
-
通过字符串索引返回
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param n int整型
* @return int整型
*/
public int findNthDigit (int n) {
// write code here
// 0
// 1 ~ 9 | digit = 1 start = 1 * 1 count = 1 * 9 * 1
// 10 ~ 99 | digit = 2 start = 1 * 10 count = 10 * 9 * 2
// 100 ~ 999 | digit = 3 start = 1 * 10 * 10 count = 100 * 9 * 3
int digcount=1;//记录区间数
int start=1; //区间上限数
int end=9;//区间下限数
if(n<=0){
return 0;
}
while(n>end){
n-=end;//减去前面的位数
digcount++;//记录区间数
start=start*10;//上限扩大10倍
end=start*end*digcount;//下线扩大start*digcount倍
}
//
String num=""+(start+(n-1)/digcount); //找到目标数字
int numIndex=(int)(n-1)%digcount ;//找到目标位数所对应目标数字的下标
return Integer.parseInt(num.charAt(numIndex)+""); //锁定位置
}
}
官方
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param n int整型
* @return int整型
*/
public int findNthDigit (int n) {
// write code here
// 0
// 1 ~ 9 | digit = 1 start = 1 * 1 count = 1 * 9 * 1
// 10 ~ 99 | digit = 2 start = 1 * 10 count = 10 * 9 * 2
// 100 ~ 999 | digit = 3 start = 1 * 10 * 10 count = 100 * 9 * 3
if (n <= 0) return 0;
long start = 1, digit = 1, count = 9;
while (n > count) {
n -= count; // 减去当前位数的总长度
start *= 10;
digit += 1;
count = start * 9 * digit;
}
// 找到当前位数的区间了
String num = (start + (n - 1) / digit) + ""; // 减去第0号元素0
int idx = (int)((n - 1) % digit);
return Integer.parseInt(num.charAt(idx) + "");
}
}