In this Leetcode Nth Digit problem solution you are given an integer n, return the nth digit of the infinite integer sequence [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, …].
Problem solution in Python.
def findNthDigit(self, n: int) -> int: if n < 10: return n i = 0 count = 0 num = 1 while True: next = ((9 * (i + 1)) * num) i += 1 if count + next >= n: break num *= 10 count += next count += 1 move, digit = divmod(n - count, i) count += move * i num += move return int(str(num)[digit])
Problem solution in Java.
class Solution { public int findNthDigit(int n) { long step = 1; long size = 9 * (int)Math.pow(10, step-1); while (n > step * size) { n -= step * size; step++; size = 9 * (int)Math.pow(10, step-1); } long number = size/9 + (long)Math.ceil((n*1.0d)/step) -1; char ansDigit = String.valueOf(number).charAt((int)((n%step-1+step)%step)); return (int)(ansDigit - '0'); } }
Problem solution in C++.
class Solution { public: #define ll long long ll power(int a){ a--; ll i=1; while(a){ a--; i*=10; } return i; } int findNthDigit(int n) { if(n<10) return n; ll div=9; ll c=1; while((n-div)>0){ n-=div; c++; div=9*power(c)*c; } n--; string tmp=to_string(power(c)+n/c); cout << tmp; return (tmp[n%c]-'0'); } };
Problem solution in C.
int findNthDigit(int n){ long digits_passed = 9; long digits_count = 1; long current_count = 0; long running_number = 0; long prev = 0; long diff, add, remainder; if(n <= 9) return n; while((current_count+ digits_passed*digits_count) < n){ current_count += digits_passed*digits_count; digits_count++; digits_passed *= 10; running_number += (digits_passed/10); } diff = (n - current_count); if(diff % digits_count == 0){ running_number += (diff/digits_count); return running_number%10; } else { prev = diff; diff += (digits_count - diff % digits_count); running_number += (diff/digits_count); prev = (prev % digits_count); digits_count = digits_count - prev; while(digits_count--) running_number /= 10; return running_number%10; } return -1; }