从零学算法400

400.给你一个整数 n ,请你在无限的整数序列 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, …] 中找出并返回第 n 位上的数字。
示例 1:
输入:n = 3
输出:3
示例 2:
输入:n = 11
输出:0
解释:第 11 位数字在序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, … 里是 0 ,它是 10 的一部分。

  • 最开始 n 对应的就是 n,但是当数字成为两位数之后就开始对不上了,所以能想到这题的关键在于随着数字位数的变化,如何找到 n 对应的结果,为了方便称呼先定义几个概念:
  • 位数(digit):这个数字有几位,比如两位数,三位数
  • 数位:比如数字 10,11,12 组成的序列 101112,其中每一位都是一个数位,其实也就是题目所说的序列上的某一位
  • 数字(num),比如 10,11,12 ,这三个数都是数字
  • 起始数字(start):某位数最小的数字,比如两位数的范围是 10~99,start 就是 10
  • 数位数量(count):只算 n 位数包含的数位数量,比如两位数为 10~99 ,有 90 个 两位数(每个数的数位数量为 2),所以位数数量为 90 * 2 = 180
  • 现在我们知道关键在于位数变化,所以研究位数变化带来的一些规律
    请添加图片描述
  • 位数递推公式:观察从一位数,两位数,三位数的变化,所以 digit(i+1) = digit(i) + 1
  • 起始数字递推公式:最小一位数为 1,最小两位数为 10…所以 start(i+1) = start(i) * 10
  • 数位数量计算公式:n 位数范围内的数位数量总和,比如一位数包含了 9 个 一位数,所以为 9*1;两位数包含了 90 个 两位数,所以为 90*2;三位数包含 900 个三位数所以为 900*3,所以规律其实就是 count = 9 * start * digit
  • 接下来我们第一步先确定 n 对应的数是几位数,其实 n 对应的是数位数量,所以我们就让 n 不断减去 count,直到 n <= count,就能得到 n 对应几位数。
  • 第二步我们确定一下他对应具体数字 num 为什么,将第一步计算完剩下的 n 整除 digit ,再加上起始值 start 就知道它对应哪个数,但是其实我们的推导过程都没去管 0 这个数,它也算一个数位,所以实际上 num 应该是 start + (n-1)/digit;
  • 确定完了 num,同理还是用 n-1,让它对 digit 取余我们就知道他在这个数的第几位,所以把 num 转为 string,num.charAt((n-1)%digit) 就是最终对应的字符,转为数字即为最终结果
  •   public int findNthDigit(int n) {long start = 1;int digit = 1;long count = 9;// 第一步while(n > count){n -= count;start*=10;digit++;count = start * digit * 9;}// 第二步long num = start + (n-1)/digit;// 第三步return Long.toString(num).charAt((n-1)%digit) - '0';}
    
  • 这是从 0 开始处理版本,不忽略 0,start 在观察一位数时为 0~9 的 0,之后才符合我们的递推公式,那么 count 也是在为一位数时为 10,之后符合递推公式,这样之后就不用 n-1,直接用 n 即可
  •   public int findNthDigit(int n) {long start = 0;int digit = 1;long count = 10;while(n > count){n -= count;if(start==0)start=10;else start*=10;digit++;count = start * digit * 9;}long num = start + n/digit;return Long.toString(num).charAt(n%digit) - '0';}
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/214689.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

乐得瑞LDR6020 VR串流线方案:实现同时充电传输视频信号

VR&#xff08;Virtual Reality&#xff09;&#xff0c;俗称虚拟现实技术&#xff0c;是一项具有巨大潜力的技术创新&#xff0c;正在以惊人的速度改变我们的生活方式和体验&#xff0c;利用专门设计的设备&#xff0c;如头戴式显示器&#xff08;VR头盔&#xff09;、手柄、定…

Android Studio 显示build variants工具栏

工具栏&#xff1a; 如下图所示 依次点击View-->ToolWindows-->Build Variants。 在此记个笔记

P8 C++引用

前言 本期我们要讲的是 C 中的引用。 上期我们讨论了指针&#xff0c;如果你没有看过那期内容&#xff0c;你一定要回去看看&#xff0c;因为引用实际上只是指针的扩展&#xff0c;你至少需要在基本层面上理解指针是如何工作的&#xff0c;然后才能继续学习本期的内容&#xf…

「Whale 帷幄」连续入选科技榜单,AGI 冲击波正在加速行业洗牌

以 AGI 为底座&#xff0c;品牌 MarTech 正在经历一场前所未有的深度变革。 近日&#xff0c;弯弓研究院发布「中国 MarTech 500 强榜单」&#xff0c;以 2023 中国营销技术&#xff08;MarTech&#xff09;生态为研究对象&#xff0c;洞察行业现象与未来趋势。作为品牌数字化…

Coded Block Pattern

Coded Block Pattern简称CBP,在H264协议7.3.2.1中有介绍,CBP表征了MB中的亮度和色度块的残差做DCT后的系数是否为0的情况,CBP可以拆分为CodedBlockLuma和CodedBlockChroma,分别对应亮度和色度块的残差系数是否为0,它们的具体含义后面会做介绍,首先我们要获取CodedBlockLu…

element ui 上传组件实现手动上传

首先需要给上传组件增加http-request属性&#xff0c;这个方法中可以获取到文件&#xff0c;并按照自己的方式进行上传。 <el-uploadreffileUploadaction#:http-requesthttpRequest:on-preview"handlePreview":on-remove"handleRemove":limit"1&q…

【数据分享】2023年我国省市县三级的瞪羚企业数量(免费获取/Excel/Shp格式)

企业是经济活动的参与主体。一个城市的企业数量决定了这个城市的经济发展水平&#xff01;比如一个城市的金融企业较多&#xff0c;那这个城市的金融产业肯定比较发达&#xff1b;一个城市的制造业企业较多&#xff0c;那这个城市的制造业肯定比较发达。 之前我们给大家分享了…

标题导航点击导航滑动到指定位置滑动到指定位置选中对应导航vue3

菜单导航栏点击导航滑动到指定位置&滑动到指定位置选中对应导航 效果 实现 话不多说直接上代码&#xff0c;有用素质三连(点赞、评论、加关注) import { defineComponent, onBeforeUnmount, onMounted, reactive, ref } from "vue"; import { map } from &quo…

加入华为云鲲鹏极简开发创造营,激活创造力,探索无限可能!

数字经济时代&#xff0c;速度、效率、质量安全已成为各行业告诉拓新发展的关键&#xff0c;华为云不断打磨敏捷安全开发的软件平台&#xff0c;为更高效率的生产力变革积蓄能量。 在刚刚过去不久的2023华为全联接大会上&#xff0c;华为最新发布了华为云CodeArts与鲲鹏DevKit…

java操作富文本插入到word模板

最近项目有个需求&#xff0c;大致流程是前端保存富文本&#xff08;html的代码&#xff09;到数据库&#xff0c;后台需要将富文本代码转成带格式的文字&#xff0c;插入到word模板里&#xff0c;然后将word转成pdf&#xff0c;再由前端调用接口下载pdf文件&#xff01; 1、思…

深入理解数据结构:链表

文章目录 &#x1f330;导语&#x1f330;链表的定义及基本结构&#x1f330;单链表&#x1f955;单链表特点 &#x1f330;双向链表&#x1f955;双链表特点 &#x1f330;循环链表&#x1f955;循环链表特点 &#x1f330;链表的操作&#x1f346;链表的插入&#x1fad8;链头…

【洛谷 P1636】Einstein学画画 题解(图论+欧拉通路)

Einstein学画画 题目描述 Einstein 学起了画画。 此人比较懒~~&#xff0c;他希望用最少的笔画画出一张画…… 给定一个无向图&#xff0c;包含 n n n 个顶点&#xff08;编号 1 ∼ n 1 \sim n 1∼n&#xff09;&#xff0c; m m m 条边&#xff0c;求最少用多少笔可以画…