Given two integers n and k, return an array of all the integers of lengthnwhere the difference between every two consecutive digits isk. You may return the answer in any order.
Note that the integers should not have leading zeros. Integers as 02 and 043 are not allowed.
We can build all valid numbers by starting from each digit 1-9 and recursively (or iteratively) appending digits whose difference with the previous digit is k, until the number has n digits.
classSolution {
public: vector<int> numsSameConsecDiff(int n, int k) {
vector<int> res;
function<void(int, int)> dfs = [&](int num, int len) {
if (len == n) { res.push_back(num); return; }
int last = num %10;
if (last + k <10) dfs(num*10+ last + k, len+1);
if (k && last - k >=0) dfs(num*10+ last - k, len+1);
};
for (int i =1; i <10; ++i) dfs(i, 1);
return res;
}
};
classSolution {
publicint[]numsSameConsecDiff(int n, int k) {
List<Integer> res =new ArrayList<>();
for (int i = 1; i < 10; ++i) dfs(n, k, i, 1, res);
return res.stream().mapToInt(i->i).toArray();
}
privatevoiddfs(int n, int k, int num, int len, List<Integer> res) {
if (len == n) { res.add(num); return; }
int last = num % 10;
if (last + k < 10) dfs(n, k, num*10 + last + k, len+1, res);
if (k > 0 && last - k >= 0) dfs(n, k, num*10 + last - k, len+1, res);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
classSolution {
funnumsSameConsecDiff(n: Int, k: Int): IntArray {
val res = mutableListOf<Int>()
fundfs(num: Int, len: Int) {
if (len == n) { res.add(num); return }
val last = num % 10if (last + k < 10) dfs(num*10 + last + k, len+1)
if (k > 0&& last - k >=0) dfs(num*10 + last - k, len+1)
}
for (i in1..9) dfs(i, 1)
return res.toIntArray()
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
classSolution:
defnumsSameConsecDiff(self, n: int, k: int) -> list[int]:
res = []
defdfs(num, length):
if length == n:
res.append(num)
return last = num %10if last + k <10:
dfs(num*10+ last + k, length+1)
if k >0and last - k >=0:
dfs(num*10+ last - k, length+1)
for i in range(1, 10):
dfs(i, 1)
return res
1
2
3
4
5
6
7
8
9
10
11
12
13
impl Solution {
pubfnnums_same_consec_diff(n: i32, k: i32) -> Vec<i32> {
letmut res =vec![];
fndfs(n: i32, k: i32, num: i32, len: i32, res: &mut Vec<i32>) {
if len == n { res.push(num); return; }
let last = num %10;
if last + k <10 { dfs(n, k, num*10+ last + k, len+1, res); }
if k >0&& last - k >=0 { dfs(n, k, num*10+ last - k, len+1, res); }
}
for i in1..10 { dfs(n, k, i, 1, &mut res); }
res
}
}