数字序列中某一位的数字

数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。

请写一个函数,求任意第n位对应的数字。

  • 示例 1:
    输入:n = 3
    输出:3

  • 示例 2:
    输入:n = 11
    输出:0

  • 限制:
    0 <= n < 231

思路:digit:表示当前数字是几位数。start:表示位数为digit的数是从哪一个数开始的。count表示位数为digit的数字共占了多少位。
从1开始计算,1到9占了9位,count = 9,如果 n > count,说明第n位不在1~ 9这个区间,n -= count,下一个区间是2位数,digit = 2,从10开始,start = 10,占的位数为:digit * start * 9 (1 ~ 9有9个数,10 ~ 99有90个数,100 ~ 999有900个数)。当n < count时,第n位在start ~ start * 10 - 1这个区间。
num = start + (n - 1) / digit;num就是第n位所在的数。令num为string,n = (n - 1) / digit,num[n]就是第n为对应的数字。

int findNthDigit(int n) {
    int digit = 1;
    long start = 1;
    long count = 9;
    while (n > count) { // 计算n是在几位数的区间
        n -= count;
        digit += 1;
        start *= 10;
        count = digit * start * 9;
    }
    long num = start + (n - 1) / digit; // num 就是第 n 位所在的数
    int place = (n - 1) % digit; // 从0开始数,place 指的是 num 的第几位数
    digit = digit - 1 - place; // 计算对于 num 这个数,place 后面还有几个数字
    while (digit > 0) {
        num /= 10; // 把 place 后面的数全部清空
        digit -= 1;
    }
    return num % 10; // 返回 place 所指的那个数字
}

int findNthDigit(int n) {
    long digit = 1, start = 1, count = 9;
    while (n > count) {
        n -= count;
        digit++;
        start *= 10;
        count = digit * start * 9;
    }
    int num = (n - 1) / digit + start; // 第 n 位所在的数
    int place = (n - 1) % digit; // 在 num 上的具体位置, 从 0 开始计算
    while (place > 0) {
        num %= start; // 把 place 前面的数清空
        start /= 10;
        place--;
    }
    return num/start;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值