说明
在无限的整数序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, …中找到第 n 个数字。第11个数字在序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ... 里是0,它是10的一部分。
题解
算法
- 找到targetNum的位数(不是n的位数)
- 找到targetNum数字
- 确认n在targetNum中的位置
步骤
以n=365为例,详细规律
- 找targetNum位数,顺带计算targetNum所在
位数最小值之前的位数和
以365targetNum是3为例,3位的最小值是100,并且能得到(1-99)的位数和是9+180=189 - tagetNum的位数是
3
计算targetNum
- 先得到100之后所需要位数 = (365-100之前的位数) = 365 - 189 = 176
- targetNum = 最小位数最小值(100-1) + Math.ceil(176/3) = 158
为什么最小值要减1,因为100本身也算数,因此需要从99开始加
1
2
3
4
5
6
7
8
9
10/**除法做了向上取整, 以99=>100为例(不必在意思数组具体数字个数和含义)
99 + [1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18]
找第2位, Math.ceil(2/3) = 1 =>2 % 3 = 2
表示99 + 1 = 100, 索引 = [2-1]
找第9位, Math.ceil(9/3) = 3 =>3 %3 = 0
表示99+3=102,索引=[102最后一位]
找第8位,Math.ceil(8/3) = 2.666=>3 8 % 3 = 2
表示99+3=102 索引=[2-1]
找第7位,Math.ceil(7/3) = 2.33=>3 7%3 = 1
*/
确定n位在targetNum的索引
- 176 % 3
如果是0则是该数字的最后一位,否则余数就是n在targetNum中的索引
- 176 % 3
实现
1 | var findNthDigit = function (n = 365) { |