N桁目 — Leetcode Problem 400
Dec 10 2022
元の問題リンク: https://leetcode.com/problems/nth-digit/description/ この問題では、文字列 1,2,3,4,5 として記述された無限数列の n 桁目を見つけるよう求められます。 ,6,7,8,9… たとえば、3 桁目は 3 ですが、10 桁目は 1 (10 の 10 の位) になり、11 桁目は 0 (10 の 1 の位) になります。
元の問題リンク:https://leetcode.com/problems/nth-digit/description/
この問題では、文字列 1,2,3,4,5,6,7,8,9… として書かれた無限数列の n 桁目を見つけるように求められます。
たとえば、3 桁目は 3 ですが、10 桁目は 1 (10 の 10 の位) になり、11 桁目は 0 (10 の 1 の位) になります。
説明に入る前に、提出の 100% を打ち負かす手っ取り早い方法は次のとおりですが、少し数学を使用する必要があります。
class Solution {
public int findNthDigit(int n) {
if (n < 10) {
return n;
}
long numOfDigits = 0;
long power = 1;
while (numOfDigits + (9 * (long)Math.pow(10, power - 1) * power) <= n) {
numOfDigits += (9 * (long)Math.pow(10, power - 1) * power);
power++;
}
long quotient = (n - numOfDigits) / power;
long mod = (n - numOfDigits) % power;
long i = mod == 0 ? (quotient + (long)Math.pow(10, power - 1) - 1) : (quotient + (long)Math.pow(10, power - 1));
String num = String.valueOf(i);
return mod == 0 ? Character.digit(num.charAt(num.length() - 1), 10) : Character.digit(num.charAt((int)mod - 1), 10);
}
}
そこで、次のように、ループして n 桁目の正しい数値を計算するように変更しました。
class Solution {
public int findNthDigit(int n) {
int i = 0;
int prevIndex = 0;
int index = 0;
while (index < n) {
i++;
String num = String.valueOf(i);
prevIndex = index;
index += num.length();
}
String str = String.valueOf(i);
return Character.digit(str.charAt(n - prevIndex - 1), 10);
}
}
それをより速くして受け入れてもらう方法は、次のように、各数値範囲が生成する桁数のパターンを見つけることによって、解を O(log n) にすることでした。
Single digits 1-9 => 9 * 10^0 * 1 digits
Double digits 10-99 => 9 * 10^1 * 2 digits
...so the general formula is 9 * 10^(m - 1) * m digits for each number range
class Solution {
public int findNthDigit(int n) {
if (n < 10) {
return n;
}
long numOfDigits = 0;
long power = 1;
while (numOfDigits + (9 * (long)Math.pow(10, power - 1) * power) <= n) {
numOfDigits += (9 * (long)Math.pow(10, power - 1) * power);
power++;
}
long quotient = (n - numOfDigits) / power;
long mod = (n - numOfDigits) % power;
long i = mod == 0 ? (quotient + (long)Math.pow(10, power - 1) - 1) : (quotient + (long)Math.pow(10, power - 1));
String num = String.valueOf(i);
return mod == 0 ? Character.digit(num.charAt(num.length() - 1), 10) : Character.digit(num.charAt((int)mod - 1), 10);
}
}

![とにかく、リンクリストとは何ですか?[パート1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































