class Solution { private int distance(int upperBound, long left, long right) { var dist = 0; for (; left <= upperBound; left *= 10, right *= 10) { dist += Math.min(upperBound + 1, right) - left; } return dist; } public int findKthNumber(int n, int k) { var current = 1; --k; while (k > 0) { var d = distance(n, current, current + 1); if (d <= k) { // skipping d numbers at once ++current; k -= d; } else { current *= 10; --k; } } return current; } }