N번째 숫자 — Leetcode 문제 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…
예를 들어, 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)



































