【LeetCode笔记】剑指 Offer 44. 数字序列中某一位的数字(Java、偏数学)

题目描述

  • 比较偏数学的一道题。。众所周知这类题代码量都不大,但是就是难想= =
    在这里插入图片描述

思路 && 代码

  • 这篇题解写得很好~
  • 建议还是直接看上面的题解(结合图更好理解),这边我只是写上一点自己的笔记
  • 主要分为三个步骤:寻找对应数字的位数、寻找对应数字、寻找对应数字的最终位
  • 步骤一:通过公式 count = 9 * digit * start 来循环寻找
  • 步骤二:(n - 1) 是因为要向下取,结合计算机中除法直接向下取整的特性
  • 步骤三:(n - 1) 是因为数字的首位为第 0位
  • 总的来说,感觉是挺偏数学规律的一道题。。
class Solution {
    public int findNthDigit(int n) {
        // 0. init
        // 位数
        int digit = 1;
        // 当前位数对应最小值,比如 1 - 0, 2 - 10, 3 - 100
        long start = 1;
        // 当前位数存储的所有值的位数和: count = 9 * digit * start
        long count = 9;

        // 1. 寻找 digit
        while(n > count) {
            n -= count;
            digit++;
            start *= 10;
            count = digit * start * 9;
        }
        // 2. 找到对应的数字,比如 199:所求数字在 start 的后 (n - 1) / digit 位
        long num = start + (n - 1) / digit;

        // 3. 找到对应数字的最终位
        return Long.toString(num).charAt((n - 1) % digit) - '0';
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值