1. 程式人生 > 其它 >556. 下一個更大元素 III

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()));
        }
    }

}
心之所向,素履以往 生如逆旅,一葦以航