LeetCode——第N位数字 C++

该博客介绍了如何解决LeetCode上的一个问题,即在数字序列中找到第n位的数字。通过分析数字序列的分布规律,发现可以按位数进行分段计算。代码利用这个规律定位到具体数字,并通过字符串转换找到目标数字。这种方法避免了生成巨大字符串,提高了效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目取自LeetCode:

        这道题目的意思为可以将所有的整数序列看成一个大字符串,找出这个大字符串中的第n位元素。比如示例2的含义为在字符串“1234567891011”中取第11个元素,即下标为10的元素,那么就是‘0’。

        了解题目含义后我们可以根据这个含义来编写代码,但是直接搞出一个庞大的字符串并用下标方式寻找很不现实,因为题目要求中n的取值范围是

        所以必须想别的办法找出数字。

        观察这个字符串我们可以找到一个小规律,当数字为一位数字有(10-1)×1共9个小数字,当两位数字有(100-10)×2共180个小数字,当三位数字时一有(1000-100)×3共1800个小数字,所以我们可以根据这个规律来定位题目要求的大数字为多少,之后想找到具体的小数字就很容易了。

        PS:有一个小细节就是题目n的取值范围达到了int类型的最大值,所以要用长整形来防一下溢出。

完整代码如下:

int findNthDigit(int n) {
        long long num=0;//用长整型防溢出
        int x=0;
        while(num<n){//判断题目要求数字所在位置为几位数
            num+=9*pow(10,x)*(x+1);
            x++;
        }
        x--;
        num-=9*pow(10,x)*(x+1);
        n-=num;
        int i=n/(x+1);//记录第几个数字
        int j=n%(x+1);//记录所需数字位置
        int v;
        if(!j) v=pow(10,x)+i-1;
        else v=pow(10,x)+i;//v即为定位的大数字,之后只需要根据j找到单个小数字输出即可
        string s=to_string(v);//这里采用转换为string的方式快速寻找。
        if(j)return s[j-1]-48;
        else return s[x]-48;
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值