题目:

给你一个整数 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 }

力扣400(java)-第N位数字(中等)的更多相关文章

  1. java 生成8位数字作为UID

    java 生成8位数字作为UUID: /*** * 生成uid 8位数字 */public static String generateUID(){ Random random = new Rando ...

  2. 力扣(LeetCode)191. 位1的个数

    编写一个函数,输入是一个无符号整数,返回其二进制表达式中数字位数为 '1' 的个数(也被称为汉明重量). 示例 1: 输入:00000000000000000000000000001011 输出:3 ...

  3. 力扣 - 剑指 Offer 46. 把数字翻译成字符串

    题目 剑指 Offer 46. 把数字翻译成字符串 思路1(递归,自顶向下) 这题和青蛙跳台阶很类似,青蛙跳台阶说的是青蛙每次可以跳一层或者两层,跳到第 n 层有多少种解法,而这题说的是讲数字翻译成字 ...

  4. 力扣Leetcode 面试题56 - I. 数组中数字出现的次数

    面试题56 - I. 数组中数字出现的次数 一个整型数组 nums 里除两个数字之外,其他数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度是O(n),空间复杂度是O(1). 示例 ...

  5. java . 请在小于99999的正整数中找符合下列条件的数,它既是完全平方数,又有两位数字相同,如:144,676。

    import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; //请在小于99999的正整数中找符合下列条件的 ...

  6. java 生成20位唯一ID,生成不会重复的20位数字----https://blog.csdn.net/weixin_36751895/article/details/70331781

    java 生成20位唯一ID,生成不会重复的20位数字----https://blog.csdn.net/weixin_36751895/article/details/70331781

  7. 力扣——single number (只出现一次的数字) python实现

    题目描述: 中文: 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现吗? 英 ...

  8. 力扣——single number 2(只出现一次的数字 2) python实现

    题目描述: 中文: 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现吗? ...

  9. Java实现 LeetCode 402 移掉K位数字

    402. 移掉K位数字 给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小. 注意: num 的长度小于 10002 且 ≥ k. num 不会包含任何前导零. 示 ...

  10. 力扣算法经典第一题——两数之和(Java两种方式实现)

    一.题目 难度:简单 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数, 并返回它们的数组下标. 你可以假设每种输入只会对应一 ...

随机推荐

  1. 移远4G数传模块EC800M开发总结之基本备忘

    一 前记 1 EC800M模块是移远推出的小尺寸低功耗针对可穿戴市场的数传产品.笔者在几个产品上使用过程中,遇到了一些问题. 这里做个备忘吧. 二 梳理 1 工具,这个串口的默认波特率为115200. ...

  2. Ubuntu 16.04 配置NFS

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  3. springboot整合视频点播

    1 //上传视频到阿里云 2 @Override 3 public String uploadAyl(MultipartFile file) { 4 try { 5 //accessKeyId,acc ...

  4. KingbaseES数据库批量加载数据的最佳方法

    前言 本文讨论在KingbaseES数据库服务器中批量加载数据的方法,以及空数据库中的初始数据加载和增量数据加载的最佳做法. 批量加载方法 以下数据加载方法按照从最耗时到最不耗时的顺序排列: 1.运行 ...

  5. 初学 FSMC - 外扩SRAM(三)

    1. FSMC相关函数 //FSMC初始化 void FSMC_NORSRAMInit(FSMC_NORSRAMInitTypeDef* FSMC_NORSRAMInitStruct); //FSMC ...

  6. 【已解决】Android学习---注册和登录功能模块合并报错以及解决办法

    问题① 我在另外一个项目里写了一个注册和登录功能的几个文件,当我想把这些代码和另一个文件合起来的时候就出现了问题. 首先不可以直接把另外一个项目的某个文件直接复制过来, 最好的办法是重新新建一个相同名 ...

  7. 【直播回顾】战码先锋第五期:深入理解OpenHarmony系统启动,轻松踏上设备软件开发之旅

    6月14日晚上19点,战"码"先锋第五期直播 <深入理解OpenHarmony系统启动,轻松踏上设备软件开发之旅> ,在OpenHarmony社群内成功举行.   本期 ...

  8. SQL 通配符:用于模糊搜索和匹配的 SQL 关键技巧

    SQL通配符字符 通配符字符用于替代字符串中的一个或多个字符.通配符字符与LIKE运算符一起使用.LIKE运算符用于在WHERE子句中搜索列中的指定模式. 示例 返回所有以字母 'a' 开头的客户: ...

  9. 【Kotlin】List、Set、Map简介

    1 List ​ Java 的 List.Set.Map 介绍见 → Java容器及其常用方法汇总. 1.1 创建 List 1.1.1 emptyList var list = emptyList& ...

  10. 想学习eTS开发?教你开发一款IQ-EQ测试应用

    原文:https://mp.weixin.qq.com/s/eZgifjirAW58dFCa0W7kSQ,点击链接查看更多技术内容. 开发者Mack基于HarmonyOS的ArkUI框架开发的IQ- ...