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

147 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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);