N'inci hane — Leetcode Problemi 400
Dec 10 2022
Orjinal problem linki: https://leetcode.com/problems/nth-digit/description/ Bu problemde 1,2,3,4,5 şeklinde yazılmış sonsuz dizinin n. basamağını bulmamız isteniyor. ,6,7,8,9… Örneğin 3. basamak 3 ama 10. basamak 1 (10'un onlar basamağı) ve 11. basamak 0 (10'un birler basamağı) olacaktır.
Orijinal sorun bağlantısı:https://leetcode.com/problems/nth-digit/description/
Bu problemde 1,2,3,4,5,6,7,8,9… şeklinde yazılmış sonsuz dizinin n. basamağını bulmamız isteniyor.
Örneğin, 3. basamak 3, ancak 10. basamak 1 (10'un onlar basamağı) ve 11. basamak 0 (10'un birler basamağı) olacaktır.
Açıklamalara geçmeden önce, gönderimlerin %100'ünü geçen hızlı yaklaşım şudur, ancak biraz matematik kullanmak zorundayız:
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);
}
}
Bu yüzden, döngü yapmaya ve n'inci basamağın olacağı doğru sayıyı hesaplamaya geçtim, şöyle:
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);
}
}
Daha hızlı hale getirmenin ve kabul ettirmenin yolu, aşağıdaki gibi her bir sayı aralığının kaç basamak üretildiğine dair bir model bularak O(log n) çözümünü yapmaktı.
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);
}
}
Gene Simmons, KISS Çizgi Romanlarının Potansiyel Olarak "İnsanlığı Yeniden Yaratabileceğini" Söyledi
Donovan, Şarkılarından 1'ini The Beatles'ın "Lucy in the Sky with Diamonds" şarkısıyla karşılaştırdı
Charly Reynolds Yakın Zamandaki Vokal Kord Ameliyatını Açıkladı: 'Şarkı Söylemekte Sorun Yaşıyordum'
Tom Girardi Dolandırıcılık Suçlamalarından Yargılanma Yetkisinin Belirlenmesi İçin Duruşmaya Katıldı

![Bağlantılı Liste Nedir? [Bölüm 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































