leetcode面试题46. 把数字翻译成字符串

题目来源

在这里插入图片描述

解题方法

首先我们要知道目标数字是几位数,1-9共9个数,10-99共90个数且一个数占2位,100-999共900个数且一个数占3位
举例:532
532-9-90*2=343 < 900 * 3,所以我们可以知道这是三位数里面的第343位,那么每3个是一组,所以343/3=114余1,即100+114=214里面的第1个数2

class Solution {
public:
    int findNthDigit(int n) {
        long base = 9;
        int digit=1;
        while(n-base*digit > 0){
            n-=(base*digit);
            base*=10;
            digit++;
        }
        int idx = n % digit; // 该数的第几个
        if(idx==0)
            idx=digit;
        int num=1;
        for(int i=1;i<digit;i++){
            num*=10;
        }
        num += (idx==digit) ? n/digit-1 : n/digit;

        for(int i=idx;i<digit;i++){
            num/=10;
        }
        return num%10;
    }
};

明白思路以后就可以进行简化

class Solution {
public:
    int findNthDigit(int n) {
        n-=1;
        for(long digit=1; digit < 11; digit++){
            int firstNum=pow(10,digit-1);
            if(n<firstNum*9*digit){
                return int(to_string(firstNum+n/digit)[n%digit] - '0');
            }
            n-=(firstNum*9*digit);
        }
        return 0;
    }
};

其中n-=1的原因,我们拿156进行讲解,如果n%digit原来的值是2,说明希望拿到5,那么在“156”这个字符串中对应下标就是1,如果n%digit原来是1,说明希望拿到1,那么在“156”这个字符串中对应下标是0,如果n%digit原来是0,说明希望拿到155的5,对应下标为2,因此将n-1,能够正确拿到字符串对应下标的数字,即n%digit的0,1,2与字符串中对应下标的关系是-1,0,1,其中-1就代表上一个数的最后一个

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值