From 58c76022e01210353a082f1317987fb27359b4b1 Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Thu, 1 Mar 2018 11:01:59 +0800 Subject: [PATCH] auto commit --- notes/剑指 offer 题解.md | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/notes/剑指 offer 题解.md b/notes/剑指 offer 题解.md index 39340e31..3fe9200a 100644 --- a/notes/剑指 offer 题解.md +++ b/notes/剑指 offer 题解.md @@ -53,6 +53,7 @@ * [41.2 字符流中第一个不重复的字符](#412-字符流中第一个不重复的字符) * [42. 连续子数组的最大和](#42-连续子数组的最大和) * [43. 从 1 到 n 整数中 1 出现的次数](#43-从-1-到-n-整数中-1-出现的次数) + * [44. 数字序列中的某一位数字](#44-数字序列中的某一位数字) * [45. 把数组排成最小的数](#45-把数组排成最小的数) * [49. 丑数](#49-丑数) * [50. 第一个只出现一次的字符位置](#50-第一个只出现一次的字符位置) @@ -1401,6 +1402,44 @@ public int NumberOf1Between1AndN_Solution(int n) { } ``` +## 44. 数字序列中的某一位数字 + +**题目描述** + +数字以 0123456789101112131415... 的格式序列化到一个字符串中,求这个字符串的第 index 位。 + +```java +int digitAtIndex(int index) { + if (index >= 0) { + int digit = 1; + while (true) { + int amount = getAmountOfDigit(digit); + int totalAmount = amount * digit; + if (index < totalAmount) return digitAtIndex(index, digit); + index -= totalAmount; + digit++; + } + } + return -1; +} + +private int getAmountOfDigit(int digit) { + if (digit == 1) return 10; + return (int) Math.pow(10, digit - 1); +} + +private int digitAtIndex(int index, int digits) { + int number = beginNumber(digits) + index / digits; + int remain = index % digits; + return (number + "").charAt(remain) - '0'; +} + +private int beginNumber(int digits) { + if (digits == 1) return 0; + return (int) Math.pow(10, digits - 1); +} +``` + ## 45. 把数组排成最小的数 **题目描述**