import java.util.*;
import java.util.stream.*;
class Solution {
private static final List<Integer> STARTERS_1_5 = List.of(1, 2, 3, 4, 5, 6, 7, 8, 9);
private static final Map<Integer, List<Integer>> STARTERS_6_9 = Map.of(
6, List.of(1, 2, 3, 6, 7, 8, 9),
7, List.of(1, 2, 7, 8, 9),
8, List.of(1, 8, 9),
9, List.of(9)
);
public int[] numsSameConsecDiff(int n, int k) {
if (k == 0) {
return IntStream.range(1, 10)
.map(i -> Integer.parseInt(String.valueOf(i).repeat(n)))
.toArray();
} else {
var result = new ArrayList<Integer>();
List<Integer> starters = null;
if (k < 6) {
starters = STARTERS_1_5;
} else {
starters = STARTERS_6_9.get(k);
}
starters
.forEach(digit -> toNum(result, 0, digit, n - 1, k));
return result.stream()
.mapToInt(Integer::intValue)
.toArray();
}
}
private boolean isDigit(int n) {
return n <= 9 && n >= 0;
}
private void toNum(List<Integer> result, int upper, int digit, int n, int k) {
if (n == 0) {;
result.add(upper + digit);
} else {
var val = digit * (int)Math.pow(10, n) + upper;
var low = digit - k;
var high = digit + k;
if (isDigit(low) && isDigit(high)) {
toNum(result, val, low, n - 1, k);
toNum(result, val, high, n - 1, k);
} else if (isDigit(low)) {
toNum(result, val, low, n - 1, k);
} else {
toNum(result, val, high, n - 1, k);
}
}
}
}