发现规律+问题拆分
前言
找规律属于看问题的一种,也是算法的一种考察角度。通过第N位数字打开找规律的思路,享受类通项公式的迅速求值。除此之外,问题拆解,循环递进也是算法考察的另一个角度。
一、第N位数字
二、发现规律+问题拆分
package everyday;
// 第N位数字
public class FindNthDigit {
/*
target:从1到N,N个数字组成的字符串,找到idx = n 的数字。
如:12345678910,第11位数字为0.
1-9 : 占9位, 后面找到规律补充:1 * 1 * 9
10-99:占 2 * 10 * 9
100-999:占 3 * 100 * 9
1000-9999:占4 * 1000 * 9
综上:i * 10^(i - 1) * 9
1-先确定n是在第几位数中,
2-再确定它在那一个数,
3-再确定它在这个数的第几位。
*/
public int findNthDigit(int n) {
// 确定n在第几位数中。
int i = 1;
while (n - i * Math.pow(10, i - 1) * 9 >= 0) {
n -= (i + 1) * Math.pow(10, i) * 9;
++i;
}
// 确定它在那个数。
int k = n / i + 1;
int val = (int) Math.pow(10, i - 1) + k - 1;
// 确定它在这个数的第几位。
int mod = i - (n % i);
if (mod == i) return (val - 1) % 10;// 如果n % i == 0说明就是上一个值的末尾。
// 从右往左看,占到第几位,就不断除10取整即可。
while (mod > 0) {
val /= 10;
--mod;
}
// 返回从右到左第mod位。
return val % 10;
}
}
总结
1)找规律。
2)问题拆解。
参考文献
[1] LeetCode 第N位数字