400. 第 N 位数字

博客给出了LeetCode第400题“第N位数字”的题解链接,该题属于算法相关内容,涉及一定的数据结构知识。

链接:

​​​​​​400. 第 N 位数字

题解:

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

class Solution {
public:
    int findNthDigit(int n) {
        int len=1;//初始数字长度为1
        int base=1;//初始范围为1~9
        while(n>(long)len*9*base){//如果n不在当前的数字范围内
            n-=len*9*base;//减去前面的数字的长度和
            len++;//下一轮计算的数字长度
            base*=10;//范围为之前的10倍
        }
        int index = n-1;//剩余的长度为n,这n个字符的编号是从0开始的,而我们要找的就是第n-1个字符
        int start = pow(10,len-1);//当前范围内的最小值
        int num = start+index/len;//寻找n对应的数字,用n除以数字长度就知道是从start开始的第几个数字了
        int digit = index%len;//寻找n对应的数字的第几位
        return int(num/pow(10,len-digit-1))%10;//取数字num的第digit位
        // char ch = to_string(num)[digit]; //转成字符串再输出也可以
        // return ch-'0';
    }
};
class Solution {
public:
    int findNthDigit(int n) {
        if (n <= 0) {
            return 0;
        }
        int len = 1;
        while (n > (long)9*(long)pow(10, len-1)) {
            n -= 9* (long)pow(10, len-1);
            ++len;
        }
        int index = n-1;
        int start = pow(10, len-1);
        int step = index/len;
        int num = start + step;
        int i = index%len;
        return to_string(num)[i] - '0';
    }
};

以下是使用 Kotlin 实现的代码: ```kotlin fun findNthDigit(n: Int): Int { var base = 1 var digits = 1 var num = 9 while (n > num * digits) { n -= num * digits digits++ num *= 10 base *= 10 } val index = (n - 1) / digits val numStr = (base + index).toString() val digitIndex = (n - 1) % digits return numStr[digitIndex].toString().toInt() } ``` 该算法的思路如下: 1. 定义 `base`、`digits` 和 `num` 三个变量,分别表示当前数的第一个数、当前数的数字数和当前数的数字数目; 2. 如果 `n` 大于当前数的数字数,则将 `n` 减去当前数的数字数,增加 `digits`,`num` 乘以 10,`base` 也乘以 10; 3. 根据 `n` 计算当前数上的数字在当前数字区间中的索引 `index`; 4. 将 `base` 和 `index` 相加得到当前数上的数字的字符串表示; 5. 根据 `digitIndex` 取出该数字的对应数上的字符,并将其转换为整数返回。 例如,当 `n` 为 15 时,根据算法计算可得当前数为 2,`base` 为 10,`digits` 为 2,`num` 为 90。此时,我们需要找到第 15 个数字,减去 2 数字所占的 18 个数后,剩余 15 - 18 = -3,说明需要查找的数字在下一,因此将 `digits` 增加 1,`num` 乘以 10,`base` 也乘以 10。此时,`digits` 为 3,`num` 为 900,`base` 为 100。继续计算可得当前数上的数字在当前数字区间中的索引为 (15 - 18 - 3) / 3 = 1,因此当前数上的数字为 100 + 1 = 101,第 15 个数字为 1。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值