2231. 按奇偶性交换后的最大数字
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
题解
思路
统计坐标奇偶性,统计奇偶数个数
通过坐标奇偶性填充最大奇偶数即可
代码
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;
}
}
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 孤寂灬无痕
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果