Return all non-negative integers of length
n
such that the absolute difference between every two consecutive digits is k
.Note that every number in the answer must not have leading zeros. For example,
01
has one leading zero and is invalid.You may return the answer in any order.
Example 1:
Input: n = 3, k = 7 Output: [181,292,707,818,929] Explanation: Note that 070 is not a valid number, because it has leading zeroes.
Example 2:
Input: n = 2, k = 1 Output: [10,12,21,23,32,34,43,45,54,56,65,67,76,78,87,89,98]
Constraints:
2 <= n <= 9
0 <= k <= 9
풀이
재영
const numsSameConsecDiff = (n, k) => { const arr = []; const dfs = (val) => { if (val.length === n) return arr.push(val); const lastNumber = +val[val.length - 1]; const diffSet = new Set([lastNumber - k, lastNumber + k]); diffSet.forEach((diff) => { if (diff >= 0 && diff < 10) dfs(`${val}${diff}`); }); }; for (let i = 1; i < 10; i += 1) { dfs(`${i}`); } return arr; };
효성
실패한 풀이
var numsSameConsecDiff = function(n, k) { const answer = []; const pushToAnswer = (str) => { str[0] !== '0' && answer.push(Number(str)); if(str[str.length - 1] !== '0') { const reversed = str.split('').reverse().join(''); answer.push(Number(reversed)); } } if(n >= 3 && k !== 0) { for(let i = 0; i < 10; i++) { let str = ''; let temp = i; let canPush = true; str += i; for(let j = 0; j < n - 1; j++) { temp += k; if(temp >= 10) { canPush = false; break; } str += temp; } canPush && pushToAnswer(str); } } for(let i = 0; i < 10; i++) { let str1 = ''; let str2 = ''; const a = i; const b = i + k; if(b >= 10) { break; } for(let j = 0; j < n; j++) { if(j % 2 === 0) { str1 += a; str2 += b; } else { str1 += b; str2 += a; } } if(a === b) { str1[0] !== '0' && answer.push(Number(str1)); } else { str1[0] !== '0' && answer.push(Number(str1)); str2[0] !== '0' && answer.push(Number(str2)); } } return answer; };
참고한 풀이
var numsSameConsecDiff = function(N, K) { let prevSet = new Set([0,1,2,3,4,5,6,7,8,9]); for (let n = 2; n <= N; n++) { // we start at 2 since n = 1 is just the one digit numbers 0 through 9 const newSet = new Set(); [] // 현재 반복문에서 찾을 수 있는 값 for (const prevVal of prevSet) { // 0~9 const lastDig = prevVal % 10; // 10의 자리수만 체킹 const plusK = lastDig + K; // 1의 자리수를 찾음 const minusK = lastDig - K; // 1의 자리수를 찾음 if (prevVal > 0 && plusK < 10) newSet.add((prevVal * 10) + plusK); if (prevVal > 0 && minusK >= 0) newSet.add((prevVal * 10) + minusK); } prevSet = newSet; } return [...prevSet]; };