leetcode(力扣) 400. 第 N 位数字 (数学规律)

题目描述:

给你一个整数 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 的一部分。

思路分析:

这道题暴力过不去啊~ 我上来直接用的暴力,从0开始数,这道题的数量级非常大1 <= n <= 231 - 1 暴力直接超时了。

在使用暴力法的时候,已经有优化的思路。
0-9都是一位数。总共有 1 * 9 = 9位数
10-99都是两位数。 总共有 2 * 90 = 180位数
100-999都是三位数,总共有 3 * 900 = 2700位数
所以我们可以根据所给出的n找到这个n是属于几位数。

比如给的n是300, 则 300-180-9 = 111。
所以所找的位数一定是三位数。因为一位数的末尾是9位,二位数的末尾是9+180位。
因为定位到三位数,三位数每一位都是三位。所以 111/3 = 37
直接定位到了是三位数第37个数,由于没有余数,所以我们要找到的是 137里的第0位,实际上就是136的最后一位数 6。

完整代码:

class Solution:
    def findNthDigit(self, n: int) -> int:
        base = 9
        base_wei = 1  # 表示位数
        while n > base_wei * base:
            n -= base * base_wei
            base *= 10
            base_wei +=1
        n -=1
        temp =  n //base_wei
        # 数字
        num = 10  **  (base_wei-1) + temp
        # 看看要的是该数字的第几位
        index_num =  n % base_wei
        return int(str(num)[index_num])
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

深度不学习!!

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值