• Unreal is funny !!!

leetcode 400. Nth Digit

Java 站长 5年前 (2020-04-15) 960次浏览 已收录 0个评论
文章目录[隐藏]

经过两天的刷题,今天的刷题就不那么难了,哈哈哈,感觉这两天自己的水平真的有所提高,早上起来刷了一个medium难度的,早上花一个小时写好了,晚上验证,花了五分钟就调试好了。

题干

https://leetcode.com/problems/nth-digit/

对于数列 1,2,3,4.。。。 把它们当做字符串黏在一起,变成 1,2,3,4,5,请问第 n 个字符是什么?

分析过程

好吧,又是这种令人揪心的题目,一开始想着,即使写好估计边界条件也得搞个半小时吧,随着数字增长,位数是不断增加的,而且增长是有规律的,规律是可以算出来的,我的主要思路 是先确定答案是在哪个几位数区间里,比如 n=13,则全部一位数的长度小于13,而全部二位数的长度大于13,则n=13在二位数里,然后遍历进行确定其准确位置,这道题是个细活,不难,主要是思维的强度要跟的上,以后这种题我还是放到精力旺盛的时间做吧。

代码

 

class Solution {
    //    400. Nth Digit
    public static int findNthDigit(int n) {
        if (n <= 9) {
            return n;
        }
        int k = 1;
        for (int i = 1; i < n; i++) { int k_plus_1_sum = cal_sum(i + 1); if (k_plus_1_sum >= n) {
                k = i;
                break;
            }
        }
        int sum0 = cal_sum(k);//n的位数是 k+1,我们先计算k 位数之前的总位数
        int left = n - sum0;//剩下来的位数;剩下来的数字应该是在k+1位数范围内

        int dijige = (int) Math.ceil(left / (double) (k + 1));
        int yushu = left % (k + 1);
        if (yushu == 0) {
            yushu = k + 1;
        }
        String c = "";
        for (int i = 0; i < k; i++) {
            c += "9";
        }
        int c99 = Integer.parseInt(c);//k位数最后一个
        int yaoqudeshu = c99 + dijige;//终于找到包含答案的数字
        String daan = "" + String.valueOf(yaoqudeshu).charAt(yushu-1);
        return Integer.valueOf(daan);
    }

    /**
     * 计算 k 位 数 以前的数字字数之和
     *
     * @param k
     * @return
     */
    public static int cal_sum(int k) {
        double pow = Math.pow(10, k);
        return (int) (k * pow - (pow - 1) / 9);
    }

    public static void main(String[] args) {
        int res = findNthDigit(11);
        System.out.println(res);
    }
}

代码写的超级烂,不想改了,就酱吧。

总结

思维上的懒惰要克服,不要害怕耗费脑细胞。


本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:leetcode 400. Nth Digit
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址