556. 下一个更大元素 III
给你一个正整数 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()));
}
}
}
心之所向,素履以往 生如逆旅,一苇以航