leetcode题:400. 第N个数字(简单)

一、题目描述:400. 第N个数字(简单)

在无限的整数序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...中找到第 n 个数字。

注意:
n 是正数且在32为整形范围内 ( n < 231)。

示例 1:

输入:
3

输出:
3
示例 2:

输入:
11

输出:
0

说明:
第11个数字在序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ... 里是0,它是10的一部分。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/nth-digit
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、解题思路

找数学规律

1~9,是一位,总共1*9

10~99 是两位,总共2*9*10

100~999是三位 总共3*9*100

所有每次取整数量总和,count = sum(i*9*pow(i-1)) ,找到count<n的i的最小值,然后剩下n-count里面寻找第num = (n-count)/i个数,当mod = (n-count)%i == 0时,取num的最后一位,当mod>0时,取num+1的i-mod-1位

三、代码

class Solution {
public:
    int findNthDigit(int n) {
        int i = 1;
        int count = 0;
        bool is_out = false;
        while(count < n)
        {
            //cout<<count<<endl;
            
            
            if(INT_MAX - count < 9 * i * pow(10,i-1))
            {
                is_out = true;
                break;
            }
            count += 9 * i * pow(10,i-1);
            i++;
        }
        if(i == 2)
        {
            return n;
        }
        if(is_out == false)
            count -= (9 * (i-1) * pow(10,i-2));
        else
            i++;

        int left = n - count;
        int num = left/(i-1);
        int mod = left%(i-1);
        int num_now = pow(10,i-2) + num-1;

        int tmp = i -1 - mod;
        int mod_left = 0;

        if(mod == 0)
            return num_now%10;
        num_now++;
       for(;tmp >= 0;tmp--)
        {
            mod_left = num_now % 10;
            num_now =num_now / 10;
        }
        return mod_left;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值