556. 下一個更大元素 III
阿新 • • 發佈:2021-12-10
給你一個正整數n ,請你找出符合條件的最小整數,其由重新排列 n中存在的每位數字組成,並且其值大於 n 。如果不存在這樣的正整數,則返回 -1 。
注意 ,返回的整數應當是一個 32 位整數 ,如果存在滿足題意的答案,但不是 32 位整數 ,同樣返回 -1 。
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/next-greater-element-iii
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
心之所向,素履以往 生如逆旅,一葦以航import java.util.*; class Solution { private static final List<Integer> max = Arrays.asList(2, 1, 4, 7, 4, 8, 3, 6, 4, 7); private static List<Integer> getDigit(int n) { List<Integer> ret = new ArrayList<>(); while (n != 0) { ret.add(n % 10); n /= 10; } Collections.reverse(ret); return ret; } private static int getNumber(List<Integer> digits) { int ret = 0; for (int i = 0; i < digits.size(); ++i) { ret = ret * 10 + digits.get(i); } return ret; } private static boolean hasNext(List<Integer> list) { for (int i = 1; i < list.size(); ++i) { if (list.get(i) > list.get(i - 1)) { return true; } } return false; } private static boolean greatThanMax(List<Integer> digits) { if (digits.size() < max.size()) { return false; } for (int i = 0; i < max.size(); ++i) { if (digits.get(i) > max.get(i)) { return true; } if (digits.get(i) < max.get(i)) { return false; } } return false; } private static void swap(List<Integer> digits, int a, int b) { int tmp = digits.get(a); digits.set(a, digits.get(b)); digits.set(b, tmp); } private static void reverse(List<Integer> digits, int left, int right) { while (left < right) { swap(digits, left++, right--); } } private static void next(List<Integer> digits) { int i = digits.size() - 2; while (i >= 0 && digits.get(i) >= digits.get(i + 1)) { i--; } if (i >= 0) { int j = digits.size() - 1; while (digits.get(i) >= digits.get(j)) { j--; } swap(digits, i, j); } reverse(digits, i + 1, digits.size() - 1); } public static int nextGreaterElement(int n) { List<Integer> digits = getDigit(n); if (!hasNext(digits)) { return -1; } next(digits); if (greatThanMax(digits)) { return -1; } return getNumber(digits); } public static void main(String[] args) { Scanner in = new Scanner(System.in); while (in.hasNext()) { System.out.println(nextGreaterElement(in.nextInt())); } } }