高频leetcode数学部分:400. 第 N 位数字

400. 第 N 位数字

难度中等294
给你一个整数 n ,请你在无限的整数序列 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, …] 中找出并返回第 n 位上的数字。

示例 1:
输入:n = 3输出:3
示例 2:
输入:n = 11输出:0解释:第 11 位数字在序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ... 里是 0 ,它是 10 的一部分。

提示:

  • 1 <= n <= 231 - 1

思路

  • 模拟+找规律

代码

class Solution {
public:
    int findNthDigit(int n) {
        /*
        1-9 10-99 100-999 1000-9999 10000-99999
        9    90*2 900*3     9000*4
        */
        int s=9,temp,i=1,count=9,flag=0;
        if(n<=s)
            return n;
        while(s<n)//从两位数:10开始
        {
            i++;
            temp=pow(10,i-1);
            if(temp<1e8)//防止越界
                temp=9*temp*i;
            else
                flag=1;
            
            if( flag==1||(n>=s&&n-s<=temp) )
            {
                int x=(n-s+1)/i;//这段第几个数字
                int y=(i-1)-(n-s-1)%i;//第几位
                x+=count;//数字x
                i=x%10;//余数
                while(y-->=0)
                {
                    i=x%10;
                    x=x/10;//倒序
                }
                return i;
            }
            s+=temp;
            count+=9*pow(10,i-1);//第几阶段
        }
        return 0;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值