剑指offer 44. 字符串的排列(迭代 + 求整 / 求余)

本文介绍了《剑指Offer》中第44题的解题思路和代码实现,主要涉及迭代和求整/求余的方法。通过不断更新digit、start和count的值,定位到数字序列中的特定位数,并返回该位上的数字。代码中利用了转换为字符串后的索引来获取指定位置的数字。整个过程的时间复杂度为log级别。
摘要由CSDN通过智能技术生成

2021年01月08日 周五 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】



1. 题目简介

剑指 Offer 44. 数字序列中某一位的数字
在这里插入图片描述

2. 迭代 + 求整 / 求余

2.1 解题思路

以下解题思路来自大佬 Krahets,十分感谢。
在这里插入图片描述

2.2 代码

注意: 定位到所在的数字(num),以及求取最终的结果时,因为start是从0号位置开始的,所以n 要减1

class Solution {
public:
    int findNthDigit(int n) {
        int digit = 1;
        long start = 1, count = 9;
        while(n>count){
            n -= count;
            digit += 1;
            start *= 10;
            count = digit*start*9;
        }
        // 定位到所在的num,注意 n 要减1
        long num = start + (n-1) / digit;
        // 得到最终结果,注意 n 要减1
        return to_string(num)[(n-1) % digit] - '0';
    }
};

因为 count = digit*start*9; start *= 10;,所以时间复杂度以及最后字符串的长度(num转化而来)都是 log 级别的。
在这里插入图片描述


参考文献

《剑指offer 第二版》

https://leetcode-cn.com/problems/shu-zi-xu-lie-zhong-mou-yi-wei-de-shu-zi-lcof/solution/mian-shi-ti-44-shu-zi-xu-lie-zhong-mou-yi-wei-de-6/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值