lee上有趣题目

这里写目录标题

400

在这里插入图片描述

在这里插入图片描述

class Solution {
   
    public int findNthDigit(int n) {
   
        // num表示具体的整数
        int num = 1;
        // count表示几位数
        int count = 1;
        // 9 * num * count 表示几位数总共有多少位数,比如,三位数从100~999,一共是 9 * 100 * 3 = 2700 位数
        while (n > 9 * (long) num * count) {
   
            // 从小到到依次减去一位数、两位数、三位数,直到减不了为止
            n -=  9 * num * count;
            // num此时记录的是几位数的第一个数,依次是1、10、100、1000
            num *= 10;
            // count表示几位数,每经过一轮加1,表示下一次判断的位数加1
            count++;
        }

        // 此时的 n 表示从 num 开始取第多少位
        // 比如,此时n=5,num=100,count=3,表示从100开始取第5位
        // 那么,100是三位,101是三位,所以,第5位肯定在101这个整数的第2位,也就是0
        // num += (n - 1) / count; 用来确定是哪个具体的整数了,这里 n-1 是为了防止边界情况,比如n=3,count=3,这时候会取超了
        // n -= (n - 1) / count * count; 用来确定是哪个具体的位,n=5-3=2,注意 4/3*3=3,不等于4
        // count-n,上面算出来的n是从高到低的第几位,通过 count-n 转成第低到高的第几位
        // (num / (int) Math.pow(10, count - n)) % 10; 取出那个位的数字
        

        // 确定是具体哪个整数
        num += (n - 1) / count;
        // 确定是这个整数中的哪个位
        n -= (n - 1) / count * count;

        // 取出那个位的数字
        return (num / (int) Math.pow(10, count - n)) % 10;
    }
}

作者:tong-zhu
链接:https://leetcode.cn/problems/nth-digit/solution/tong-ge-lai-shua-ti-la-zhao-gui-lu-by-to-nvfa/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

根据
在这里插入图片描述
根据这个特性
我们可以逼近n的位数
如果N是个三位数

那么n的位置一定大于9+902
小于9+90
2+900*3

class Solution {
   
    public int findNthDigit(int n) {
   
        // num表示具体的整数
        int num = 1;
        // count表示几位数
        int count = 1;
        // 9 * num * count 表示几位数总共有多少位数,比如,三位数从100~999,一共是 9 * 100 * 3 = 2700 位数
        while (n > 9 * (long) num * count) {
   
            // 从小到到依次减去一位数、两位数、三位数,直到减不了为止
            n -=  9 * num * count;
            // num此时记录的是几位数的第一个数,依次是1、10、100、1000
            num *= 10;
            // count表示几位数,每经过一轮加1,表示下一次判断的位数加1
            count
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值