• 剑指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;
    }
    

       

  • 相关阅读:
    JS Dom_API
    JS 动态表格(添加、删除行)
    将本地网页上传到 apache2 及 github 的步骤
    软件工程之美 第一周
    树莓派安装芯片驱动并测试
    Visoul Studio 2019 远程调试 中文乱码
    Visoul Studio 2019 远程调试 RaspberryPi C 项目
    课设提纲
    PHP PDO 一 : 常用方法
    设置子域名及申请其证书
  • 原文地址:https://www.cnblogs.com/buaaZhhx/p/12019287.html
Copyright © 2020-2023  润新知