数字序列中某一位的数字:最直观的想法是,将数字序列转换为字符串,然后利用字符串长度函数来获取对应位数的相应数字即可。但是该题中函数的参数值只有第n位而没有数字序列,所以我们需要对数字序列找规律。数字序列为“01234567891011...”,即按照0、1、2、3...自然数依次排列,并且序列位数从0开始,即第0位是0、第1位是1、第2位是2...第10位是1等依次类推。

idea:第一步确定输入的数位n对应的位数digit,比如求第n=15位对应的数字,那么n=15这个数的位数digit=2,如此便可以定位到其对应的区间,为了规律性我们忽略掉0,比如区间1~9,起始位置start为1,位数digit为1位,9个数,占位count为9位,区间10~99,起始位置start为10,位数digit为2位,90个数,占位count为180位,区间100~999,起始位置start为100,位数digit为3位,900个数,占位count为2700位...由此可以得到count=9*start*digit,15大于9故15位于2位的区间上;第二步确定n在哪一个数字上,2位的区间起始位置start为10,对应的数字为start+(n-1)/digit,其中n为15-9=6,故第15位对应在数字12上;第三步确定位数在目标数字的第几位上,使用(n-1)% digit来获取,因为下标从0开始,所以需要对n减一,故5%2=1,即第15位在数字12的第1位为2。最后将数字转换为字符串,取对应位数上的值并转换为int类型即可。注意(n-1)好好想想!

int findNthDigit(int n) 
{
    //第0位对应数字0
    if(n==0)
      return 0;
    int digit=1; //位数
    //start和count使用longlong 因为10的9次方
    long long int start=1; //区间起始位置
    long long int count=9; //区间占位 count=9*start*digit
    //定位n在某个位数的区间 不可以相等喔 比如n=9
    while(n>count)
    {
        n-=count; //减去区间占位数
        digit++; //区间数字位数加一
        start*=10; //区间起始位置乘以10
        count=9*start*digit; //新的区间占位数
    }
    //定位n在某个数上 由于start表示第0位 故n需要减去1 即该区间一共n位 向下取整 n需要减去1
    int num=start+(n-1)/digit;
    //定位n在数num的第几位上 位数从0开始 故n需要减一
    int index=(n-1)%digit;
    //使用字符串获取该数位上的结果
    int res=to_string(num)[index]-'0';
    return res;
}