第N位数字[学会找规律,发现类似通项公式的捷径]

前言

找规律属于看问题的一种,也是算法的一种考察角度。通过第N位数字打开找规律的思路,享受类通项公式的迅速求值。除此之外,问题拆解,循环递进也是算法考察的另一个角度。

一、第N位数字

在这里插入图片描述

二、发现规律+问题拆分

package everyday;

// 第N位数字
public class FindNthDigit {
    /*
    target:从1到N,N个数字组成的字符串,找到idx = n 的数字。
    如:12345678910,第11位数字为0.
    1-9 : 占9位, 后面找到规律补充:1 * 1 * 9
    10-99:占 2 * 10 * 9
    100-999:占 3 * 100 * 9
    1000-9999:占4 * 1000 * 9
    综上:i * 10^(i - 1) * 9
    1-先确定n是在第几位数中,
    2-再确定它在那一个数,
    3-再确定它在这个数的第几位。
     */
    public int findNthDigit(int n) {
        // 确定n在第几位数中。
        int i = 1;
        while (n - i * Math.pow(10, i - 1) * 9 >= 0) {
            n -= (i + 1) * Math.pow(10, i) * 9;
            ++i;
        }
        // 确定它在那个数。
        int k = n / i + 1;
        int val = (int) Math.pow(10, i - 1) + k - 1;
        // 确定它在这个数的第几位。
        int mod = i - (n % i);
        if (mod == i) return (val - 1) % 10;// 如果n % i == 0说明就是上一个值的末尾。
        // 从右往左看,占到第几位,就不断除10取整即可。
        while (mod > 0) {
            val /= 10;
            --mod;
        }
        // 返回从右到左第mod位。
        return val % 10;
    }
}

总结

1)找规律。
2)问题拆解。

参考文献

[1] LeetCode 第N位数字

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值