「这是我参与11月更文挑战的第23天,活动详情查看:2021最后一次更文挑战」
简单模拟
观察下列数据
| 标题 | 数字数量 | 所有数字个数 |
|---|---|---|
| 1-9之间 | 9 | 9 |
| 10-99之间 | 180 | 189 |
| 100-999之间 | 2700 | 2889 |
| ... | ... | ... |
| - 之间 |
其中n表示数字有多少位;
通过上述规律,通过模拟计算是不是可以到的目标数大概是个几位数?
第1步:找目标数是第几位数
let len = 1
let t = 0
while (t + len * 9 * Math.pow(10, len - 1) < n) {
t += len * 9 * Math.pow(10, len - 1)
len++
}
// 当t>n是,len表示目标数是一个多少位的数
第2步:找具体目标数
len位数字,起始位置一定是start = Math.pow(10, len - 1)
n落在len位置的某个数可以通过下面公式计算得到
offset = Math.floor(n - t - 1 / len)
其中,t是第1步的结果
找到偏移量,在目标数中找到对应下标即可得到答案
代码如下
代码
var findNthDigit = function (n) {
//字符串长度
let len = 1
let t = 0
while (t + len * 9 * Math.pow(10, len - 1) < n) {
t += len * 9 * Math.pow(10, len - 1)
len++
}
const diff = n - t - 1
const offset = Math.floor(diff / len)
const p = diff % len
const start = Math.pow(10, len - 1)
const string = String(start + offset)
return string[p]
}