2231. 按奇偶性交换后的最大数字

给你一个正整数 num 。你可以交换 num奇偶性 相同的任意两位数字(即,都是奇数或者偶数)。

返回交换 任意 次之后 num最大 可能值

示例 1:

输入:num = 1234
输出:3412
解释:交换数字 3 和数字 1 ,结果得到 3214 。
交换数字 2 和数字 4 ,结果得到 3412 。
注意,可能存在其他交换序列,但是可以证明 3412 是最大可能值。
注意,不能交换数字 4 和数字 1 ,因为它们奇偶性不同。

示例 2:

输入:num = 65875
输出:87655
解释:交换数字 8 和数字 6 ,结果得到 85675 。
交换数字 5 和数字 7 ,结果得到 87655 。
注意,可能存在其他交换序列,但是可以证明 87655 是最大可能值。

 提示:

  • 1 <= num <= 109

题解

思路

  1. 统计坐标奇偶性,统计奇偶数个数

  2. 通过坐标奇偶性填充最大奇偶数即可

代码

class Solution {
    public int largestInteger(int num) {
        int result = 0;
        int[] countsOdd = new int[10];
        int[] countsEven = new int[10];
        int[] indexArray = new int[10];
        int index = 0;
        int temp;
        while (num > 0) {
            temp = num % 10;
            if ((temp & 1) == 1) {
                indexArray[index] = 1;
                countsOdd[temp]++;
            } else {
                countsEven[temp]++;
            }
            index++;
            num = num / 10;
        }
        int indexOdd = 9;
        int indexEven = 8;
        while (--index > 0) {
            if (indexArray[index] == 1) {
                while (countsOdd[indexOdd] < 1) {
                    indexOdd -= 2;
                }
                result += indexOdd;
                countsOdd[indexOdd]--;
            } else {
                while (countsEven[indexEven] < 1) {
                    indexEven -= 2;
                }
                result += indexEven;
                countsEven[indexEven]--;
            }
            result *= 10;
        }
        if (indexArray[index] == 1) {
            while (countsOdd[indexOdd] < 1) {
                indexOdd -= 2;
            }
            result += indexOdd;
        } else {
            while (countsEven[indexEven] < 1) {
                indexEven -= 2;
            }
            result += indexEven;
        }
        return result;
    }
}