剑指 Offer 44.!! 数字序列中某一位的数字

这篇具有很好参考价值的文章主要介绍了剑指 Offer 44.!! 数字序列中某一位的数字。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

参考资料
剑指 Offer 44. 数字序列中某一位的数字
中等
351
相关企业
数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。

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

示例 1:

输入:n = 3
输出:3
示例 2:

输入:n = 11
输出:0

限制:

0 <= n < 2^31

思路:
其实并没有什么特别的……就是数数,边数边删(见下面代码的while循环),直到最后落在某个区间,这就能确定目标所在的位置是 几位数的群体(即退出while循环后的digit, 如果digit=2,那么说明落在10-99之间),
再在这个群体里定位是哪一个数字(见int num那一行。比如,27);
进一步,定位是这个数字的哪一位(见最后的return语句。比如,第一位,即7)
注意:从0开始数,也就是0就是第0位,1就是第1位。文章来源地址https://www.toymoban.com/news/detail-615845.html

class Solution {
    public int findNthDigit(int n) {
        int digit=1;
        int count=9;// 
        int start=1;
        while(n>count){
            n-=count;
            digit++;
            start*=10;
            count = digit*start*9;//10-99, 100-999, 
        }
        int num = start+(n-1)/digit;
    
        return Long.toString(num).charAt((n-1)%digit)-'0';// !! 注意这里取出第((n-1)%digit)个字符之后,怎么将它转化为整数再返回

    }

// 参考资料:下面是LeetCode,K神的代码,可以看到大神把start,count这些增长比较快的数设置成Long型;注意最后将某个字符转成数字的代码;注意这代码已经将n=0的情况考虑在内,此时不进入while循环,(n-1)/digit=-1, so num=0.
     public int findNthDigit2(int n) {
        int digit = 1;
        long start = 1;
        long count = 9;
        while (n > count) { // 1.
            n -= count;
            digit += 1;
            start *= 10;
            count = digit * start * 9;
        }
        long num = start + (n - 1) / digit; // 2.
        return Long.toString(num).charAt((n - 1) % digit) - '0'; // 3.
    }


}

到了这里,关于剑指 Offer 44.!! 数字序列中某一位的数字的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 剑指offer12 矩阵中的路径 13 机器人的运动范围 34.二叉树中和为某一值得路径

    //写的有点问题,暂时想不到怎么改,先放着,通过用例71/83 卡住的是abcd 但是改了又有问题 无语 看了 答案 都写不对 在类成员里面定义了row和col 就不要重复定义了 不然不知道为什么就开始发疯 先贴出蠢货写出来的东西 审题也审不明白 机器人只能上下左右走 不能一行一行

    2024年02月15日
    浏览(31)
  • 【剑指 offer】旋转数组的最小数字

    ✨个人主页:bit me👇 ✨当前专栏:算法训练营👇 核心考点:数组理解,二分查找,临界条件 描述: 有一个长度为 n 的非降序数组,比如[1,2,3,4,5],将它进行旋转,即把一个数组最开始的若干个元素搬到数组的末尾,变成一个旋转数组,比如变成了[3,4,5,1,2],或者[4,5,1,2,3]这

    2023年04月20日
    浏览(43)
  • 【剑指offer】数组中重复的数字

    👑专栏内容:力扣刷题 ⛪个人主页:子夜的星的主页 💕座右铭:前路未远,步履不停 剑指offer:数组中重复的数字 在一个长度为 n 的数组里的所有数字都在 0 0 0 到 n − 1 n-1 n − 1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复,也不知道每个数字重复了几

    2024年01月20日
    浏览(35)
  • 剑指 Offer 31. 栈的压入、弹出序列 / LeetCode 946. 验证栈序列(栈模拟)

    链接:剑指 Offer 31. 栈的压入、弹出序列;LeetCode 946. 验证栈序列 难度:中等 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的 所有数字均不相等 。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序

    2024年02月16日
    浏览(35)
  • 剑指offer33.二叉搜索树的后序遍历序列

     我一开始的想法是:后序遍历是左右根,那么第一个数小于第二个数,第二个数大于第三个数,然后从第三个数开始又循环,显然错了,因为我这种是理想情况,是一个满二叉树。正确的解法是: 后序遍历是[[左子树],[右子树],[根节点]],左子树中的所有值都小于根节点,

    2024年02月16日
    浏览(29)
  • 【LeetCode-中等】剑指 Offer 31. 栈的压入、弹出序列(详解)

    输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。 示例

    2024年02月13日
    浏览(30)
  • 【剑指offer|1.数组中重复的数字】

    : 长度为n的数组nums中所有数字都在0~n-1范围内 返回任意一个重复的数字 总体时间复杂度和空间复杂度分析: 修改数组的方法: 因为有n个元素,每一个元素都在0~(n-1)范围内,如果元素不重复的话, 对数组重排之后,下标和元素值之间应该是一一对应的关系 但是因为

    2023年04月22日
    浏览(30)
  • 剑指 Offer 03. 数组中重复的数字

    剑指 Offer 03. 数组中重复的数字 利用题目的限制条件: 所有数字都在 0~n-1 的范围内 通过交互让数字和下标一一对应,如果有多个数字对应同一个下标,那就找到了答案。 另一种写法

    2024年02月11日
    浏览(27)
  • 剑指offer03.数组中重复的数字

    看到这道题的第一眼想到的是先给它排序,然后双指针从左往右遍历,写了一个冒泡排序,但是我想到了应该会超时,因为冒泡时间复杂度是n的平方,输入大小时10000,肯定会超时,然后右又看了一下题目看到数字都是0-n-1,灵感一下子就来了,我先创建一个等大的自然数数

    2024年02月11日
    浏览(29)
  • 用 Go 剑指 Offer 31. 栈的压入、弹出序列 (辅助栈)

    输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。 示例

    2023年04月14日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包