LeetCode-in-Java

1432. Max Difference You Can Get From Changing an Integer

Medium

You are given an integer num. You will apply the following steps exactly two times:

Let a and b be the results of applying the operations to num the first and second times, respectively.

Return the max difference between a and b.

Example 1:

Input: num = 555

Output: 888

Explanation: The first time pick x = 5 and y = 9 and store the new integer in a.

The second time pick x = 5 and y = 1 and store the new integer in b.

We have now a = 999 and b = 111 and max difference = 888

Example 2:

Input: num = 9

Output: 8

Explanation: The first time pick x = 9 and y = 9 and store the new integer in a.

The second time pick x = 9 and y = 1 and store the new integer in b.

We have now a = 9 and b = 1 and max difference = 8

Constraints:

Solution

import java.util.ArrayDeque;
import java.util.Deque;

public class Solution {
    public int maxDiff(int num) {
        Deque<Integer> stack = new ArrayDeque<>();
        int xMax = 9;
        int yMax = 9;
        int xMin = 0;
        int yMin = 0;
        int min = 0;
        int max = 0;
        boolean areDigitsUnique = true;
        while (num != 0) {
            if (!stack.isEmpty() && num % 10 != stack.peek()) {
                areDigitsUnique = false;
            }
            stack.push(num % 10);
            num /= 10;
            if (stack.peek() != 9) {
                xMax = stack.peek();
            }
            if (stack.peek() > 1) {
                xMin = stack.peek();
            }
        }
        if (areDigitsUnique || stack.peek() == xMin) {
            // Handles no leading zeros/non zero constraints.
            yMin = 1;
        }
        while (!stack.isEmpty()) {
            min = min * 10 + (stack.peek() == xMin ? yMin : stack.peek());
            max = max * 10 + (stack.peek() == xMax ? yMax : stack.peek());
            stack.pop();
        }
        return max - min;
    }
}