开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第15天,点击查看活动详情
题目描述
给你一个正整数 num 。你可以交换 num 中 奇偶性 相同的任意两位数字(即,都是奇数或者偶数)。
返回交换 任意 次之后 num 的 最大 可能值 。
来源:力扣(LeetCode)
- 示例 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
思路分析
根据题意可知,题目给出一个正整数num。我们需要交换正整数num中的 奇偶性相同的任意两个数,然后返回一个最大的数,简单的来说就是把奇数和偶数的最大值往前放。
拿到的num是一个数字类型,所以需要将它转换成字符串再转数组,得到数组方便运算。得到数组后,循环数组,将奇数和偶数分开放进各自的数组里,这样就形成了两个数组,一个奇数的数组和一个偶数的数组。将两个数组排序,由大往小排。循环原本的数组,判断奇偶数,若是奇数排序将最大的数替换掉奇数,若是偶数就排序将最大的数字替换掉偶数。循环结束之后再将数组转换成数字返回出去。
AC代码
function solution(num) {
let arr = String(num).split('');
let odd = [], even = [], index1=0, index2=0;
for(let i=0; i<arr.length; i++) {
if(arr[i] % 2 === 0) {
even.push(arr[i]);
}else{
odd.push(arr[i]);
}
}
odd.sort((a,b) => b -a);
even.sort((a,b) => b - a);
for(let i=0; i<arr.length; i++) {
if(arr[i] % 2 === 0) {
arr[i] = even[index1];
index1 += 1
}else{
arr[i] = odd[index2++];
}
}
console.log(arr)
}
let num = 1234;
solution(num);