Numbers With Same Consecutive Differences

LeetCode August - Day 18

Problem Statement

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 except for the number 0 itself. For example, 01 has one leading zero and is invalid, but 0 is valid.

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] 

Note:
1 <= N <= 9 0 <= K <= 9

Code (terrible initial attempt)

/**
 * @param {number} N
 * @param {number} K
 * @return {number[]}
 */
const numsSameConsecDiff = (N, K) => {
  let q = []
  for(let i = 0; i < 10; i++) q.push(i);
  
  if(N === 1) return q;
  let result = [], mag = 1, numLength = 1

  while(q.length){
    let qlen = q.length;
    
    for(let i = 0; i < qlen; i++){
      let curr = q.shift()
      let prevDigit = Math.floor(curr / 10 ** (mag - 1))
      
      if(K === 0){
        q.push(curr + (prevDigit) * 10**mag);
        continue
      }
      
      if(prevDigit + K < 10) {
        q.push(curr + (prevDigit+K) * 10**mag);
      }
      
      if(prevDigit - K >= 0) {
        q.push(curr + (prevDigit-K) * 10**mag);
      }
    }
    
    if(++numLength === N){
      result = [...q].filter(x => x.toString().length === N)
      break;
    }
    
    mag++
  }
  
  return result
};

Code (I gave up. Found this online)

var numsSameConsecDiff = function(N, K) {
    let prevSet = new Set([0,1,2,3,4,5,6,7,8,9]);
    const min =  Math.pow(10, N - 1);
    
    for (let n = 2; n <= N; n++) {
        const newSet = new Set();
        
        for (const prevVal of prevSet) {
            const lastDig = prevVal % 10;
            
            const plusK = lastDig + K;
            const minusK = lastDig - K;
            
            if (prevVal > 0 && plusK < 10) newSet.add((prevVal * 10) + plusK);
            if (prevVal > 0 && minusK >= 0) newSet.add((prevVal * 10) + minusK);
        }
        
        prevSet = newSet;
    }

    return [...prevSet];
};