From 3e6fb6ee7f2bc9c9cc66acc28fc58dc219bcf0eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=94=90=E6=A0=91=E6=A3=AE?= <14021051@buaa.edu.cn> Date: Mon, 1 Oct 2018 11:15:50 +0800 Subject: [PATCH] Create 400. Nth Digit.md --- 400. Nth Digit.md | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 400. Nth Digit.md diff --git a/400. Nth Digit.md b/400. Nth Digit.md new file mode 100644 index 0000000..0b13a71 --- /dev/null +++ b/400. Nth Digit.md @@ -0,0 +1,37 @@ +# [400. Nth Digit](https://leetcode.com/problems/nth-digit/description/) +# 思路 +计算序列1、2、3、4、5、6、7、8、9、10、11...中第n个数字(digit,注意不是数)是什么。 +我们可以将这个序列分成很多类: +* 第一类:1、2、3...9共9(设为base,下同)个数, 即每个数只包含1(设为k,下同)个数字,一共有base * k = 9 个数字; +* 第二类:10、11、12...99,base = 90,k = 2; +* 第三类:100、101、102...999,base = 900,k = 3; +* ...... + +设所求的digit落在数target上,则我们可根据上述规律算出target具体是多少,然后再算出所求具体是target的哪一个digit。 +注意: +当我们算base * k 的时候,结果可能超过int的表示范围,所以要定义成long long型。 +# C++ +``` +class Solution { +public: + int findNthDigit(int n) { + if(n < 10) return n; + + // 计算target + long long base = 9, k = 1; + while(n > base * k){ + n -= base * k; + base *= 10; + k++; + } + int target = base / 9 + (n - 1) / k; + + // 计算所求digit具体是target的哪一位 + while(n % k != 0) { + target /= 10; + n++; + } + return target % 10; + } +}; +```