力扣 400. 第 N 位数字

本文详细介绍了如何解决LeetCode上的一个问题——找到无限数列[1,2,3,4,5...]中第n位数字的方法。通过分析数列规律,确定目标数字所在的整数位数,然后逐步定位到具体数字及其位置,最终实现算法。代码中展示了具体的实现步骤,包括计算整数位数、确定整数和计算数字在整数内的位置。
摘要由CSDN通过智能技术生成

题目来源:https://leetcode-cn.com/problems/nth-digit/

大致题意:
假设有一个无限延伸的数组 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11…]
求出数组的第 n 位数字,比如 10 是第 9 个数字,其中组成 10 的 1 为第 9 位,0 为 第 10 位

思路

找规律就会发现,长度为 len 的数,共有 9 * 10^(len - 1) 个,也就是长度为 len 的数共有 len * 9 * 10^(len - 1) 位数字

找规律

既然知道了某一类位数的数字有多少位,就可以用循环减的方式确定第 n 位数字所在的整数的长度(位数):

  • 若 n 大于 len * 9 * 10^(len - 1),那么显然 n 应该在更长的位数的整数中,减去 len * 9 * 10^(len - 1),把 len++ ,再重复本步操作,直至不满足条件为止。

求出位数 len 后,再确定 n 所在的该长度数的第几个数,之后再确定 n 在该数的哪一位,取出该位即为答案

代码:

public int findNthDigit(int n) {
        int len = 1;
        // 求出 n 所在的整数的位数长度
        while (n > (long) len * 9 * Math.pow(10, len - 1)) {
            n -= (long) len * 9 * Math.pow(10, len - 1);
            len++;
        }
        // 求出 n 所在的整数为该位的哪个数
        // 假设所在整数的值为 x,那么有0 (x - 10^(len - 1) + 1)* len >= n
        // 于是有 x >= n / len - 1 + 10^(len - 1)
        long base = (long) Math.pow(10, len - 1);
        long x = n / len - 1 + base;
        // 已知 x,接下来求出 n 所在的整数为 x 的第几位
        // 先将 n 减去所有位数之和
        n -= (x - base + 1) * len;
        // n 若为 0,代表所求数为 x 的最后一位
        // 否则,所求数在下一位
        int ans = n == 0 ? (int) (x % 10) : (int) ((x + 1) / (int) (Math.pow(10, len - n)) % 10);
        return ans;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三更鬼

谢谢老板!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值