数字序列中某一位的数字:最直观的想法是,将数字序列转换为字符串,然后利用字符串长度函数来获取对应位数的相应数字即可。但是该题中函数的参数值只有第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; }