经过两天的刷题,今天的刷题就不那么难了,哈哈哈,感觉这两天自己的水平真的有所提高,早上起来刷了一个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); } }
代码写的超级烂,不想改了,就酱吧。
总结
思维上的懒惰要克服,不要害怕耗费脑细胞。