题目信息

  • 时间: 2019-07-01

  • 题目链接:Leetcode

  • tag: 规律

  • 难易程度:中等

  • 题目描述:

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

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

示例1:

输入:n = 3
输出:3

示例2:

输入:n = 11
输出:0

提示

1. 0 <= n < 2^31

解题思路

本题难点

0<n<9时,第n位对应的数字为n。n>9时,需要确定n对应的数字的位数,再确定n对应的数字,最后确定n对应数字的哪一位上。

具体思路

  1. 将 101112⋯ 中的每一位称为 数位 ,记为 n;

  2. 将 10,11,12,⋯ 称为 数字 ,记为 num ;

  3. 数字 10是一个两位数,称此数字的 位数 为 2 ,记为 digit;

  4. 每 digit 位数的起始数字(即:1,10,100,⋯),记为 start 。

    数字范围 位数 数字数量 数位数量
    1~9 1 9 9
    10~99 2 90 180
    100~999 3 900 2700
    ... ... ... ...
    start~end digit 9*start 9* start * digit

求解步骤:

  • 确定 n所在 数字 的 位数 ,记为 digit ;
  • 确定 n所在的 数字 ,记为 num ;
  • 确定 n是 num中的哪一数位,并返回结果。

代码

class Solution {
public int findNthDigit(int n) {
int digit = 1;
long start =1;
long count = 9;
//确定所求数位的所在数字的位数
while(n > count){
n -= count;
digit += 1;
start *= 10;
count = digit * start * 9;
}
// 确定所求数位所在的数字
long num = start + (n -1) / digit;
//确定所求数位在 num 的哪一数位
return Long.toString(num).charAt((n-1)%digit) - '0';
}
}

复杂度分析:

  • 时间复杂度 O(logn) : 所求数位 n 对应数字 num 的位数 digit 最大为 O(logn) ;第一步最多循环 O(logn) 次;第三步中将 num 转化为字符串使用 O(logn) 时间;因此总体为 O(logn) 。
  • 空间复杂度 O(logn) : 将数字 num 转化为字符串 str(num) ,占用 O(log⁡n)的额外空间。

每日一题 - 剑指 Offer 44. 数字序列中某一位的数字的更多相关文章

  1. 剑指 Offer 44. 数字序列中某一位的数字 + 找规律 + 数位

    剑指 Offer 44. 数字序列中某一位的数字 Offer_44 题目描述 题解分析 java代码 package com.walegarrett.offer; /** * @Author Wale ...

  2. 《剑指offer》第四十四题(数字序列中某一位的数字)

    // 面试题44:数字序列中某一位的数字 // 题目:数字以0123456789101112131415…的格式序列化到一个字符序列中.在这 // 个序列中,第5位(从0开始计数)是5,第13位是1, ...

  3. 【Offer】[44] 【数字序列中某一位的数字】

    题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 数字以0123456789101112131415..的格式序列化到一个字符序列中.在这个序列中,第5位(从0开始计数)是5,第13位是 ...

  4. 每日一题 - 剑指 Offer 40. 最小的k个数

    题目信息 时间: 2019-06-30 题目链接:Leetcode tag: 快排 难易程度:中等 题目描述: 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3. ...

  5. 每日一题 - 剑指 Offer 43. 1~n整数中1出现的次数

    题目信息 时间: 2019-07-01 题目链接:Leetcode tag: 整除 取余 规律 递归 难易程度:中等 题目描述: 输入一个整数 n ,求1-n这n个整数的十进制表示中1出现的次数. 例 ...

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

    题目描述 数字以0123456789101112131415-的格式序列化到一个字符序列中.在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等. 请写一个函数,求任意第n位 ...

  7. 《剑指offer》面试题44. 数字序列中某一位的数字

    问题描述 数字以0123456789101112131415-的格式序列化到一个字符序列中.在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等. 请写一个函数,求任意第n位 ...

  8. 剑指offer——46数字序列中某一位的数字

    题目: 数字以0123456789101112131415…的格式序列化到一个字符序列中.在这个序列中,第5位(从0开始计数)是5,第13位是1,第19位是4,等等.请写一个函数,求任意第n位对应的数 ...

  9. 【剑指offer】73.数组中出现次数超过一半的数字

    73.数组中出现次数超过一半的数字 知识点:数组:哈希:占领地思想: 题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4 ...

随机推荐

  1. 数据结构&算法

    20个最常用.最基础数据结构与算法: 10个数据结构:数组.链表.栈.队列.散列表.二叉树.堆.跳表.图.Trie 树. 10个 算法      :递归.排序.二分查找.搜索.哈希.贪心.分治.回溯. ...

  2. mysql基础-数据库表的管理-记录(四)

    0x01 MySQL中字符大小写 1.SQL关键字及函数不区分大小写 2.数据库.表及视图名称的大小写区分与否取决于底层OS及FS 3.存储过程.存储函数及事件调度器的名字不区分大小写,但触发器区分大 ...

  3. C语言-耶稣门徒

    <span style="font-family: Arial, Helvetica, sans-serif;"> </span> <span sty ...

  4. Jenkins job docker 没有权限

    问题描述 基于docker使用jenkins 构建cicd,在执行docker build 的时候出现了权限的问题.具体报错如下 + REPOSITORY=10.0.0.100/library/wen ...

  5. Keiichi Tsuchiya the Drift King (c++三角函数公式)【几何+三角函数公式】

    Keiichi Tsuchiya the Drift King 感谢:  https://blog.csdn.net/xiao_you_you/article/details/89357815 题目链 ...

  6. Mybaties概述

  7. Quaternion:通过API对Quaternion(四元数)类中的方法属性初步学习总结(二)

    1.RotateTowards方法 RotateTowards(From.rotation,To.rotation,fspeed) 个人理解:使From的rotation以floatspeed为速度, ...

  8. python3 闭包函数 装饰器

    闭包函数 1.闭:定义在函数内部的函数 2.包:内部函数引用了外部函数作用域的名字 在函数编程中经常用到闭包.闭包是什么,它是怎么产生的及用来解决什么问题呢.给出字面的定义先:闭包是由函数及其相关的引 ...

  9. Python函数参数详解

    Python函数参数详解 形参与实参 什么是形参 在定义函数阶段定义的参数称之为形式参数,简称形参,相当于变量名. 什么是实参 在调用函数阶段传入的值称为实际参数,简称实参.相当于"变量值& ...

  10. 关于Java的jdbc中 DriverManager.registerDriver(driver); //注册驱动 有没有必要写的思考

    加载数据库驱动的时候,有如下部分代码: /1) 注册驱动程序 //给java.sql.Driver接口的引用赋值 com.mysql.jdbc.Driver 实现类对象// Driver driver ...