Maximum Swap

medium greedy string

Problem

Swap two digits at most once to make the number as large as possible.

Inputnum = 2736
Output7236
Swap 2 and 7.

def maximum_swap(num):
    s = list(str(num))
    last = {int(d): i for i, d in enumerate(s)}
    for i, d in enumerate(s):
        for D in range(9, int(d), -1):
            if last.get(D, -1) > i:
                j = last[D]; s[i], s[j] = s[j], s[i]; return int(''.join(s))
    return num
function maximumSwap(num) {
  const s = String(num).split('');
  const last = {};
  for (let i = 0; i < s.length; i++) last[s[i]] = i;
  for (let i = 0; i < s.length; i++)
    for (let d = 9; d > +s[i]; d--)
      if ((last[d] ?? -1) > i) { const j = last[d]; [s[i], s[j]] = [s[j], s[i]]; return Number(s.join('')); }
  return num;
}
int maximumSwap(int num) {
    char[] s = String.valueOf(num).toCharArray();
    int[] last = new int[10]; Arrays.fill(last, -1);
    for (int i = 0; i < s.length; i++) last[s[i] - '0'] = i;
    for (int i = 0; i < s.length; i++)
        for (int d = 9; d > s[i] - '0'; d--)
            if (last[d] > i) { char t = s[i]; s[i] = s[last[d]]; s[last[d]] = t; return Integer.parseInt(new String(s)); }
    return num;
}
int maximumSwap(int num) {
    string s = to_string(num);
    vector last(10, -1);
    for (int i = 0; i < (int)s.size(); i++) last[s[i] - '0'] = i;
    for (int i = 0; i < (int)s.size(); i++)
        for (int d = 9; d > s[i] - '0'; d--)
            if (last[d] > i) { swap(s[i], s[last[d]]); return stoi(s); }
    return num;
}
Time: O(n) Space: O(n)