模板
从后往前找到第一次降序的位置,将这个点换成比之前大的最小数,将后面的数字转变为尽量小(转化为升序)。
下一个排列(LeetCode31)
class Solution { public int nextGreaterElement(int n) { String s = String.valueOf(n); int k = s.length() - 1; while (k > 0 && s.charAt(k - 1) >= s.charAt(k)) { k--; } if (k == 0) { return -1; } int t = k; while (t + 1 < s.length() && s.charAt(t + 1) > s.charAt(k - 1)) { t++; } // Swap characters char temp = s.charAt(k - 1); s = s.substring(0, k - 1) + s.charAt(t) + s.substring(k, t) + temp + s.substring(t + 1); // Reverse substring from k to end StringBuilder sb = new StringBuilder(s.substring(k)); s = s.substring(0, k) + sb.reverse().toString(); long r = Long.parseLong(s); if (r > Integer.MAX_VALUE) { return -1; } return (int) r; }
}