找回密码
 立即注册
首页 业界区 安全 剑指offer-69、数字序列中某⼀位的数字

剑指offer-69、数字序列中某⼀位的数字

慎气 5 天前
题⽬描述

数字以 0123456789101112131415... 的格式作为⼀个字符序列,在这个序列中第 2 位(从下标 0 开始计算)是 2 ,第 10 位是 1 ,第 13 位是 1 ,以此类题,请你输出第 n 位对应的数字。
示例1
输⼊:0
返回值:0
示例2
输⼊:2
返回值:2
示例3
输⼊:13
返回值:1
思路及解答

暴力法

通过逐步构造数字序列来找到第n位数字
  1. public class Solution {    public int findNthDigit(int n) {        if (n < 0) return -1;        if (n == 0) return 0; // 示例1特殊情况处理[2](@ref)                StringBuilder sequence = new StringBuilder();        int num = 0;                // 逐步构建序列,直到长度超过n        while (sequence.length()  count) {            n -= count;             // 减去前一个位数范围的数字总位数            digit++;                // 位数增加            start *= 10;            // 起始数字扩大10倍            count = 9L * digit * start; // 计算新的位数范围内的总位数        }                // 步骤2:确定n所在的具体数字        long num = start + (n - 1) / digit; // 计算目标数字                // 步骤3:确定n在数字中的具体位置并返回        return Long.toString(num).charAt((n - 1) % digit) - '0';    }}
复制代码

  • 时间复杂度:O(log₁₀n),循环次数与n的位数成正比
  • 空间复杂度:O(1),只使用常数级别变量
添0补齐

假设所有数字都是i位数,通过给较短数字前面添0,使所有数字位数相同,简化定位逻辑
  1. public class Solution {    public int findNthDigit(int n) {        if (n < 0) return -1;        if (n == 0) return 0;                int i = 1; // 数字位数                // 通过添0补齐,使所有数字都视为i位数        while (i * Math.pow(10, i) < n) {            n += Math.pow(10, i); // 添0增加的位数            i++;        }                // 定位目标数字和具体位置        String num = String.valueOf(n / i);        return num.charAt(n % i) - '0';    }}
复制代码

  • 时间复杂度:O(log₁₀n),与数学规律法相同
  • 空间复杂度:O(1),常数空间复杂度

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册