剑指offer-面试题44-数字序列中某一位的数字-脑筋急转弯

Posted buaazhhx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer-面试题44-数字序列中某一位的数字-脑筋急转弯相关的知识,希望对你有一定的参考价值。

/*
题目:
	数字以0123456789101112131415…的格式序列化到一个字符序列中。
	在这个序列中,第5位(从0开始计数,即从第0位开始)是5,第13位是1,第19位是4,等等。
	请写一个函数,求任意第n位对应的数字。
*/

#include<iostream>
#include<string.h>

using namespace std;

//自己实现pow,使用codeblocks中的pow,会转化为浮点数进行截断,得到的结果不准确。
int pow(int num,int digits){

    int res = 1;
    for(int i = 0; i < digits; i++){
        res *= num;
    }
    return res;
}
/*
解法一:
	一个数字一个数字遍历,当数字位数之和超过n,则所需数字在遍历到的最后一个数字。
*/
int NumberOfSequence1(int n){
    if(n < 0) return -1;
    int currNumber = 0;
    int myCount = 0;
    while(myCount <= n){
        myCount += to_string(currNumber).size();
        currNumber++;
    }
    return to_string(currNumber-1)[n-myCount+to_string(currNumber-1).size()] -‘0‘;
}

/*
解法二:
	0~9中有10个数,10~99有2*90=180个数,100~999有3*900=2700个数
	例1001,可以有10+180<1001 && 10+180+2700>1001,所以要找的数在100~999中
	1001-10-180=881,881/3=270,881%3=1,所以要找的数在100+270=370中
	其中截止到369有810个数字,3为第811个数字,7为第812个数字,0为813个数字
	从0开始计数,则7为811位数字。
*/
int NumberOfSequence2(int n){
    if(n < 0) return -1;
    if(n < 9) return n;

    int myCount = 10;
    int i = 2;
    while(myCount <= n){
        myCount = myCount + (int)i*9*pow(10,i-1);
        i++;
    }
    int temp = n - (myCount - (i-1)*9*pow(10,i-2));
    int res_index= temp%(i-1);
    int res_val = (temp / (i - 1) + pow(10,i-2));

    return to_string(res_val)[res_index] - ‘0‘;
}




int main(){
    cout<<NumberOfSequence2(1500000)<<endl;
    cout<<NumberOfSequence1(1500000)<<endl;
}

   

以上是关于剑指offer-面试题44-数字序列中某一位的数字-脑筋急转弯的主要内容,如果未能解决你的问题,请参考以下文章

剑指offer-面试题44-数字序列中某一位的数字-脑筋急转弯

《剑指offer》第四十四题:数字序列中某一位的数字

剑指Offer对答如流系列 - 数字序列中某一位的数字

剑指 Offer 44. 数字序列中某一位的数字(找规律)

剑指 Offer 44. 数字序列中某一位的数字

剑指 Offer 44. 数字序列中某一位的数字