Lexicographical Numbers

medium dfs trie

Problem

Given an integer n, return numbers 1..n in lexicographical order.

Inputn = 13
Output[1,10,11,12,13,2,3,4,5,6,7,8,9]
Walk 1→10→11→12→13→(back to 2)→3→…→9.

def lex_order(n):
    out = []
    cur = 1
    for _ in range(n):
        out.append(cur)
        if cur * 10 <= n:
            cur *= 10
        else:
            if cur >= n: cur //= 10
            cur += 1
            while cur % 10 == 0: cur //= 10
    return out
function lexicalOrder(n) {
  const out = [];
  let cur = 1;
  for (let i = 0; i < n; i++) {
    out.push(cur);
    if (cur * 10 <= n) cur *= 10;
    else {
      if (cur >= n) cur = Math.floor(cur / 10);
      cur++;
      while (cur % 10 === 0) cur = Math.floor(cur / 10);
    }
  }
  return out;
}
class Solution {
    public List lexicalOrder(int n) {
        List out = new ArrayList<>();
        int cur = 1;
        for (int i = 0; i < n; i++) {
            out.add(cur);
            if ((long) cur * 10 <= n) cur *= 10;
            else {
                if (cur >= n) cur /= 10;
                cur++;
                while (cur % 10 == 0) cur /= 10;
            }
        }
        return out;
    }
}
vector lexicalOrder(int n) {
    vector out;
    int cur = 1;
    for (int i = 0; i < n; i++) {
        out.push_back(cur);
        if ((long long) cur * 10 <= n) cur *= 10;
        else {
            if (cur >= n) cur /= 10;
            cur++;
            while (cur % 10 == 0) cur /= 10;
        }
    }
    return out;
}
Time: O(n) Space: O(1)