modify code

master
algorithmzuo 2 years ago
parent afee1bccc9
commit f84710b397

@ -7,11 +7,11 @@ package class_2022_11_5_week;
// 1 <= n <= 2^31 - 1
public class Code04_NthDigit {
public static final long[] under = {
0L,// 0位数一共能解决几个位
9L,// 1位数一共能解决几个位
189L,// 1~2位数一共能解决几个位
2889L,// 1~3位数一共能解决几个位
public static final long[] under = {
0L, // 0位数一共能解决几个位
9L, // 1位数一共能解决几个位
189L, // 1~2位数一共能解决几个位
2889L, // 1~3位数一共能解决几个位
38889L,
488889L,
5888889L,
@ -22,9 +22,9 @@ public class Code04_NthDigit {
public static final int[] help = {
0,
1, // 1
10,// 2
100,// 3
1, // 1
10, // 2
100, // 3
1000, // 4
10000,
100000,
@ -47,45 +47,25 @@ public class Code04_NthDigit {
return number(0, len, help[len], help[len], (int) (n - under[len - 1]));
}
// path : 路径 左(低) <- 右(高)
// len : n -> 5位数 len = 5 固定!
// path : 路径 左(低) <- 右(高)
// len : n -> 5位数 len = 5 固定!
// offset : 10000 目前要决定的是高1位
// 1000 目前要决定的是高2位
// 10 目前要决定的是高2位
// 可变
// all : 10000 固定
// 1000 目前要决定的是高2位
// 10 目前要决定的是高2位
// 可变
// all : 10000 固定
// nth : 第几个
public static int number(int path, int len, int offset, int all, int nth) {
if (offset == 0) {
// 5 3 2 1 6
// path : 6 1 2 3 5
// 5 4 3 2 1
return (path / help[nth]) % 10;
} else {
// 3 _ _ _ _
int cur = 0;
int minus = 0;
// i是开始尝试的数字 最高位 i 1 2 3 4...
// 不是最高位 0 1 2 3 4
// 股数j = 1 2 3 4
for (int i = offset == all ? 1 : 0, j = 1; i <= 9; i++, j++) {
// 搞定了多少
long under = (long) j * len * offset;
if (under >= nth) {
cur = i;
break;
}
// < i不要
minus = (int) under;
int cur = offset == all ? 1 : 0;
int j = nth / (len * offset);
if (nth % (len * offset) == 0) {
j--;
}
// 1458 - 1200
// cur !
// n - minus
// 10000
// !1000
// !!100
// !!!10
return number(cur * (all / offset) + path, len, offset / 10, all, nth - minus);
cur += j;
return number(cur * (all / offset) + path, len, offset / 10, all, nth - j * len * offset);
}
}

Loading…
Cancel
Save