[路飞]_今夜找数字

202 阅读1分钟

「这是我参与11月更文挑战的第23天,活动详情查看:2021最后一次更文挑战

400. 第 N 位数字

简单模拟

观察下列数据

标题数字数量所有数字个数
1-9之间99
10-99之间180189
100-999之间27002889
.........
10n110^{n-1} - 10n10^n 之间910n19 * 10^{n-1}n910n1n*9*10^{n-1}

其中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]
 
}