Monotone Increasing Digits

medium greedy math string

Problem

Given an integer n, return the largest integer less than or equal to n whose digits are monotonically non-decreasing from left to right.

Inputn=332
Output299
332 has a drop at index 1; decrement the leading 3 to 2 and fill 99.

def monotoneIncreasingDigits(n):
    s = list(str(n))
    k = len(s)
    for i in range(len(s) - 1, 0, -1):
        if s[i - 1] > s[i]:
            s[i - 1] = chr(ord(s[i - 1]) - 1)
            k = i
    for i in range(k, len(s)): s[i] = '9'
    return int(''.join(s))
function monotoneIncreasingDigits(n) {
  const s = String(n).split('');
  let k = s.length;
  for (let i = s.length - 1; i > 0; i--) {
    if (s[i - 1] > s[i]) {
      s[i - 1] = String.fromCharCode(s[i - 1].charCodeAt(0) - 1);
      k = i;
    }
  }
  for (let i = k; i < s.length; i++) s[i] = '9';
  return parseInt(s.join(''));
}
class Solution {
  public int monotoneIncreasingDigits(int n) {
    char[] s = Integer.toString(n).toCharArray();
    int k = s.length;
    for (int i = s.length - 1; i > 0; i--) {
      if (s[i - 1] > s[i]) { s[i - 1]--; k = i; }
    }
    for (int i = k; i < s.length; i++) s[i] = '9';
    return Integer.parseInt(new String(s));
  }
}
class Solution {
public:
  int monotoneIncreasingDigits(int n) {
    string s = to_string(n);
    int k = s.size();
    for (int i = s.size() - 1; i > 0; i--) {
      if (s[i - 1] > s[i]) { s[i - 1]--; k = i; }
    }
    for (int i = k; i < (int)s.size(); i++) s[i] = '9';
    return stoi(s);
  }
};
Time: O(d) Space: O(d)