LeetCode算法题-Nth Digit(Java实现)
这是悦乐书的第215次更新,第228篇原创
01 看题和准备
今天介绍的是LeetCode算法题中Easy级别的第83题(顺位题号是400)。找到无限整数序列的第n个数字1,2,3,4,5,6,7,8,9,10,11 ......例如:
输入:3
输出:3
输入:11
输出:0
说明:序列1,2,3,4,5,6,7,8,9,10,11 ......的第11位是0,它是数字10的一部分。
注意:n为正整数且符合32位有符号整数(n <2^31)的范围。
本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。
02 第一种解法
直接使用for循环,从1开始累加字符串,返回第n-1个字符所表示的整数即可。但是此方法严重超时,不建议使用。
public int findNthDigit(int n) {
String str = "";
for (int i=1; i<= n; i++) {
str += i;
}
return Integer.parseInt(str.charAt(n-1)+"");
}
03 第二种解法
题目的意思是有一个以正整数(1,2,3,4,依次向后加1)为基础组成的序列(也可以理解为字符串),传入一个整数n,找出在该序列中的第n位数字。该序列含有以下规律:
1-9,有9个一位数,当n小于等于9的时候,可以在里面找到值。
10-99,有90个两位数,当n大于9且小于等于180+9=189时,可以在里面找到值。
100-999,有900个三位数,当n大于189且小于900x3+189=2889时,可以在里面找到值。
我们可以将此问题分解为三个步骤:
先计算该数字的位数,确定范围。
找出该数字。
确定是该数字中的第几位数。
例如:303
第一步,因为189<303<2889,所以我们要找的是一个三位数,303-189=114,此时n变成114。
第二步,我们要找的数变成了三位数中的第114位,那我们就可以计算出三位数中的第114位数是100+(114-1)/3=137。这里减1是因为在字符串中,索引是从0开始的,而我们的序列字符串是从1开始,所以要减1,你也可以从一开始就减1。
第三步,计算是137中的第几位数,(114-1)%3=2,也就是137的第2位(从0开始)数7,就是我们想要的结果。
在代码中我们使用long类型,预防溢出的风险。
public int findNthDigit2(int n) {
long start = 1, count = 1, num = 9;
while (n > num*count) {
n -= num*count;
count += 1;
start *= 10;
num *= 10;
}
start += (n-1)/count;
String result = start+"";
long index = (n-1)%count;
return result.charAt((int)index)-'0';
}
04 小结
算法专题目前已连续日更超过两个月,算法题文章83+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。
以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!
LeetCode算法题-Nth Digit(Java实现)的更多相关文章
- LeetCode算法题-Heaters(Java实现)
这是悦乐书的第239次更新,第252篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第106题(顺位题号是475).冬天来了!您在比赛期间的第一份工作是设计一个固定温暖半径 ...
- LeetCode算法题-Sqrt(Java实现)
这是悦乐书的第158次更新,第160篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第17题(顺位题号是69). 计算并返回x的平方根,其中x保证为非负整数. 由于返回类型 ...
- LeetCode算法题-Subdomain Visit Count(Java实现)
这是悦乐书的第320次更新,第341篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第189题(顺位题号是811).像"discuss.leetcode.com& ...
- LeetCode算法题-Number of Lines To Write String(Java实现)
这是悦乐书的第319次更新,第340篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第188题(顺位题号是806).我们要将给定字符串S的字母从左到右写成行.每行最大宽度为 ...
- LeetCode算法题-Unique Morse Code Words(Java实现)
这是悦乐书的第318次更新,第339篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第186题(顺位题号是804).国际莫尔斯电码定义了一种标准编码,其中每个字母映射到一系 ...
- LeetCode算法题-Rotate String(Java实现)
这是悦乐书的第317次更新,第338篇原创 在开始今天的算法题前,说几句,今天是世界读书日,推荐两本书给大家,<终身成长>和<禅与摩托车维修艺术>,值得好好阅读和反复阅读. 0 ...
- LeetCode算法题-Rotated Digits(Java实现)
这是悦乐书的第316次更新,第337篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第185题(顺位题号是788).如果一个数字经过180度旋转后,变成了一个与原数字不同的 ...
- LeetCode算法题-Letter Case Permutation(Java实现)
这是悦乐书的第315次更新,第336篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第184题(顺位题号是784).给定一个字符串S,将每个字母单独转换为小写或大写以创建另 ...
- LeetCode算法题-Minimum Distance Between BST Nodes(Java实现-四种解法)
这是悦乐书的第314次更新,第335篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第183题(顺位题号是783).给定具有根节点值的二叉搜索树(BST),返回树中任何两个 ...
随机推荐
- htmlUnit加持,网络小蜘蛛的超级进化
前言 前段时间写了个小说线上采集阅读(猛戳这里:https://www.cnblogs.com/huanzi-qch/p/9817831.html),当我们去采集起点网的小说目录时发现目录数据没有在h ...
- CloudFoundry 之 IBMCloud 项目部署.NETcore例子
步骤一 通过官网注册IBMCloud账号 https://idaas.iam.ibm.com/idaas/mtfim/sps/authsvc?PolicyId=urn:ibm:security:aut ...
- Java_文件夹拷贝
一.思路 * 文件夹的拷贝 1.递归查找子孙级文件 2.文件复制 文件夹创建 二.代码 package com.ahd.File; import java.io.File; import java.i ...
- SSM-Netty实现软硬件通信,真实项目案例
今天分享的是Myself自己工作项目中的一个模块实例实现的思路还有流程,在这过程中也是遇到了很多问题,能过顺利解决也是团队沟通的结果. 项目模拟背景:假设我们有一个软件平台,我们的线下产品是一些探测器 ...
- MySQL事务(学习笔记)
MySQL事务主要用于处理操作量大,复杂度高的数据.比如说,在人员管理系统中,你删除一个人员,你即需要人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事 ...
- 使用Linux的Crontab定时执行PHP脚本
0 */6 * * * /home/kdb/php/bin/php /home/kdb/apache/htdocs/lklkdbplatform/kdb_release/Crontab/index.p ...
- 使用CSS实现无滚动条滚动
我们都知道,撸页面的时候当我们的内容超出了我们的div,往往会出现滚动条,影响美观. 尤其是当我们在做一些导航菜单的时候.滚动条一出现就破坏了UI效果. 我们不希望出现滚动条,也不希望超出去的内容被放 ...
- nodeJs express mongodb 建站(window 10 版)
一.环境搭建 安装 node.git.npm.express.mongodb.主要介绍express.mongodb 的安装. (1)node安装:https://nodejs.org/en/down ...
- canvas-8clip.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 用grunt进行ES6转换,再用uglify压缩所有js实例
1.首先安装node.js 去官网下载exe执行文件安装即可,安装完成后自带有npm管理. 2.安装grunt CLI 在项目根文件夹下执行如下代码: npm install -g grunt-cli ...