剑指offer——搜索算法:数字序列中某一位的数字
思路
首先判断当前要检查的元素是否为个位数,如果当前为个位数,直接返回当前元素就行
如果不是个位数,先需要确定当前的n所在范围,然后用n减去上一段的总位数,获得当前元素在下一段中的位置,更新下一段的起始数字,下一段的位数++,更新当前位数段的总位数
先计算具体数字,需要将计算出来的数字-1,因为每一段都是从0开始计算的,通过对位数相除和起始值相加获得具体的数字,通过对位数取余算出当前要求的n在数字内是第几位,通过转成字符串并使用下标,获得最终结果
代码
#include <string>
class Solution {
public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param n int整型 * @return int整型*/int findNthDigit(int n) {if(n<10)return n;int digit = 1; // 当前数字的位数(从1位数开始)long long start = 1; // 当前位数段的起始数字(1位数从1开始)long long sum = 9; // 当前位数段的总位数(1位数有9位:1-9)// 步骤1:确定n所在的位数段while (n > sum) {n -= sum; // 减去当前位数段的总位数start *= 10; // 下一个位数段的起始数字digit++; // 增加数字位数sum = 9LL * start * digit; // 计算新位数段的总位数}// 步骤2:计算具体数字int num = start + (n - 1) / digit; // 当前位数段中的第几个数字// 步骤3:计算数字中的位置int index = (n - 1) % digit; // 数字中的第几位// 步骤4:转换为字符串并返回指定位return std::to_string(num)[index] - '0';}
};