ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

力扣400(java)-第N位数字(中等)

2022-08-23 15:02:24  阅读:245  来源: 互联网

标签:10 java 数字 18 力扣 num 位数 400 size


题目:

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

提示:

  • 1 <= n <= 231 - 1

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/nth-digit
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

找规律:

1~9:从1开始,都是1位数,共9个数,共 9x1 个数字;

10~99:从10开始,都是2位数,共90个数,共 90x2 个数字;

100~999:从100开始,都是3位数,共900个数,共 900x3 个数字;

....以此类推

对于给定的n,寻找目标数字,需要分三步:

1.首先找到目标数字对应的数是几位数,记为num_size;

2.然后找目标数字所对应的数值,记为num = start_num + n / num_size ;

3.最后精确定位目标数字是num中的哪个具体数字,记为target =n %num_size 。

例如:输入n = 197

1.【找到目标数字对应的数是几位数】:第197个数字所对应的数为3位数,n = 197-9-90x2=8,表示197是三位数中第8个数字,num_size=3;

2.【找目标数字所对应的数值】:num =100 + 8 / 3 = 102,从100开始三位数,8/3三个成对表示目标数字在三位数值的第2个,最终计算的得出102即在数字102中;

3.【精确定位目标数字是num中的哪个具体数字】:target = n % num_size = 8 % 3 = 2,即在102的第二位,即结果为0(索引从1开始)。

但是在代码中索引应该从0开始!!!故需要将 n / num_size ,  n %num_size 变为 (n -1) / num_size ,  (n-1) %num_size

即num = 100 + (8-1) / 3 = 102,target = (8-1) % 3 =1,即结果为102中索引为1的数字0。

【更改上面的三步骤】对于给定的n,寻找目标数字,需要分三步:

1.首先找到目标数字对应的数是几位数,记为num_size;

2.然后找目标数字所对应的数值,记为num = start_num + (n -1) / num_size 

3.最后精确定位目标数字是num中的哪个具体数字,记为target = (n-1) %num_size

例如:输入n = 27

1.【找到目标数字对应的数是几位数】:第27个数字所对应的数为2位数,n = 27-9=18,表示27是两位数中第18个数字,num_size=2;

2.【找目标数字所对应的数值】:num = 10+(18-1) / 2 = 18,从10开始两位数,17/2两个成对表示目标数字在两位数值的第8个,最终计算的得出18即在数字18中;

3.【精确定位目标数字是num中的哪个具体数字】:target = (n-1) % num_size = (18 -1) % 2 = 1,target就为18中索引为1的数字8,最终结果为8。

代码:

 1 class Solution {
 2     public int findNthDigit(int n) {
 3         //位数的初始值(1位数,2位数,3位数)
 4         int num_size = 1;
 5         //总位数以及位数的初始值
 6         //1位数的总位数9位,初始值为1
 7         long base = 9,start_num = 1;
 8         //判断目标数在几位数中
 9         while(n > base * num_size){
10             n -= base * num_size;
11             start_num *= 10;
12             num_size++;
13             base *= 10;
14         }
15         //找目标数所对应的数值
16         long cur = start_num + (n-1) / num_size;
17         //精确定位
18         int target = (n-1) % num_size;
19         //将当前数字转换成字符数组
20         char[] c = String.valueOf(cur).toCharArray();
21         //将字符转换为数字并返回
22         return c[target] - '0';
23     }
24 }

标签:10,java,数字,18,力扣,num,位数,400,size
来源: https://www.cnblogs.com/liu-myu/p/16615586.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有