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
题目解释及思路:
输入11,之所以输出的是0,是因为是按照字符来的,1234567891011,第11位是“10”的0。
根据观察:
1-9,有9个数
10-99,有902个数
100-999,有900
3个数
设n是i位数,那对应的区间有9*pow(10,i-1)*i 个数。
那我们在确定这个输入的数字所处位置的字符是哪个时,我们可以先判断这个数字在哪个区间。
找到所在区间后,判断是第几个数,在判断是第几个数的第几位。
解题方法:

class Solution {
    public int findNthDigit(int n) {
        int i = 1;//i用来记录是几位数
        while(n > Math.pow(10,i-1)*9*i){//不断让n和区间范围比,来确定n所在区间
            n-=Math.pow(10,i-1)*9*i;//这里减去了前区间的范围,所以再次比较
            i++;					//只需要和下一个区间的范围比即可,不用加之前区间的范围
        }     //找到区间后,用a来记录是第几个数字
       int a=(n-1)/i+(int)Math.pow(10,i-1);//之所以除以i,是因为i位数的区间,一个数占了i个位置
        StringBuilder sb = new StringBuilder();
        sb.append(a);//把a添加到字符串中
        sb.toString();
        return sb.charAt((n-1)%i)-'0';//确定出n是第几位,再减去0的ASCII码值即可


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值