【剑指offer】【数学】44. 数字序列中某一位的数字
题目链接:https://leetcode-cn.com/problems/shu-zi-xu-lie-zhong-mou-yi-wei-de-shu-zi-lcof/
数学
- 先确定第n位所在的数字是几位数; n - 10 - 90 * 2 - 900 * 3 - 9000 * 4 ...
- 确定第n位是几位数的第几个数(哪个数);
- 确定属于这个数的第几位。
class Solution {
public:
int digitAtIndex(int n) {
n++; //题目中是从0开始,我们从1开始计数
n--; //因为个位有10个,为了统一成 9 90 900 ,n--
//确定是第n位所在数字是几位数
// n - 10 - 90 * 2 - 900 * 3 - 9000 * 4 ...
//i表示几位数 n表示这位数有多少个 base表示这位数的第一个数是什么
long long i = 1, s = 9, base = 1;
while(n > i * s)
{
n -= i *s;
i ++;
s *= 10;
base *= 10;
}
//确定是几位数的第几个数
//例:4位数的第256个数: 1000 + 256 - 1 = 1255 n就属于1255中某一位
//number表示第n位数属于哪个数
// 向上取整 n / i == 向下取整 (n + i - 1) / i
int number = base + (n + i - 1) / i - 1;
//确定属于这个数的第几位
//余0 最后一位
int r = n % i ? n % i : i;
for(int j = 0; j < i - r; j++) number /= 10;
return number % 10;
}
};
知识的价值不在于占有,而在于使用