每日一算法

给你一个整数 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,2.。。排列的 我们要把里面的每个数字都当作是一位
比如100它就包含了3位 1 0 0,示例2里面的给的n=11 我们找到了10 的第二位是第11个数
解:
我们可以通过我们的经验知道 这些数根据他们的位数的分布:
1-9 9个 位数1 起始值 pow(10,0); 个数 pow(10,0)*9
10-99 90个 位数2 起始值 pow(10,1); 个数 pow(10,1)*9
100-999 900个 位数3 .起始值 pow(10,2); 个数 pow(10,2)*9。。。。
通过上述例子我们可以看出 它的起始值和位数有着极大的关系 甚至说它的个数也和位数有关系,通过这些关系我们可以通过一个for循环判断它是几位数,然后通过它剩余的值来获取它具体值以及索引项 从而获取值 下面是代码

class Solution {
    public int findNthDigit(int n) {
        if(n<10){//小于10直接将给的n返回
            return n;
        }
        n=n-9;//没有小于10先减去1-9的9位
        for(int i=1;i<n;i++){//此处不需要在意为什么循环n次,只是为了不让循环在获取答案前结束而设置的一个较大的值
            long temp=(long)Math.pow(10,i);//看当前的起始的值为多少
            if(n<=(9*temp)*(i+1)){//起始为乘以位数就是它占的索引 比如 100-999 占的索引 900*3
                long end=0L;
                end=temp+(n+1)/(i+1)-1;//当前你所需要的数字是几 因为我们需要向上取整所以加了1
                String result=String.valueOf(end);
                return result.charAt((n-1)%(i+1))-'0';//减一是因为需要让它成为0序的
            }
            n=(int) (n-9*temp*(i+1));//没在这几位直接减一下 进入下一次循环
        }
		return n;//无实际意义 只是为了不让编译器报错 根本执行不到这里
    }
}

本题是在leecode上做的 此处附上网址:
https://leetcode-cn.com/problems/nth-digit

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值