Sword44——数字序列中某一位的数字
方法1——迭代取余求整
- 思路:
- 明确思路,主要分为三步骤
- 首先需要找到n是处于几位数中
- 接着找到n处于几位数的哪位数中
- 之后找到n处于哪位树的哪一位中
- 特殊情况与临界分析:无
- 终止条件:无
- 步骤:
- 定义当前位数,从个位数1开始
- 定义当前位数对应的起始位、当前位数的所有数字个数所占的位数,防溢出使用long类型
- 循环条件:n大于当前位数的所有数字个数
- while循环
- n减去当前位数的所有数字个数所占位数
- 对应位数加1
- 对应位数起始位置乘以10
- 对应位数的所有数字个数所占位数,起始位置 * 9(当前位数的所有数字个数) * digit
- 因为下标从0开始,因此使用start加上(n-1除以digit为向后移动数字的个数)即为n处于的当前位数的数字
- 使用n - 1对digit取余,即为n位于该数字的哪一位上
- 返回该数字的该位的数字即可
public int findNthDigit(int n) {
int digit = 1;
long start = 1;
long count = 9;
while (n > count) {
n -= count;
digit += 1;
start *= 10;
count = start * 9 * digit;
}
long num = start + (n - 1) / digit;
int res = (n - 1) % digit;
return Long.toString(num).charAt(res) - '0';
}
![方法1——迭代取余求整](https://i-blog.csdnimg.cn/blog_migrate/612548b7e360a6c482049782e24d150b.png)