秋招 - 算法

49 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第30天,点击查看活动详情 >>

一、题目描述

有一个正整数,希望你能重排这个正整数的位数,使得他变为偶数(不能有前导零),请编写程序完成数字重排。
注:重排后可以和原数相等。 第一行输入一个正整数q表示询问次数;接下来的q行每行输入一个整数x。输出q行,每行代表一个对x的重排。
示例1:

输入:
3
13
123
24

输出:
-1
132
24

二、解题思路

本题要求对输入的正整数进行重新排序,排序后得到一个偶数。我们可以对所给的正整数从个位开始进行位数分解,并使用栈结构进行存储,若分解出的数为奇数则将其入栈,若为偶数则保存此位数,并停止分解。之后再对整数进行重新组装,既将刚刚入栈的奇数全部出栈,在出栈时先将结果乘以10再加上出栈的数。全部出栈后,再乘以10再加上之前保存的偶数,得到最后的重组整数。

三、代码

public class App {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        App app = new App();
        for (int i = 0; i < n; i++) {
            int num = sc.nextInt();
            app.oushu(num);
        }
    }

    public void oushu(int num) {
        int res = 0;
        Stack<Integer> s = new Stack<>();
        int temp = 0;
        while (num > 0) {
            if ((num % 10) % 2 == 0) {
                temp = num % 10;
                break;
            }
            s.push(num % 10);
            num = num / 10;
        }
        if (num == 0) {
            System.out.println(-1);
        } else {
            num = num / 10;
            while (!s.isEmpty()) {
                num = num * 10 + s.pop();
            }
            System.out.println(num * 10 + temp);
        }
    }
}

四、总结

本题使用栈结构对整数分解的数进行入栈保存,在每次分解时将个位数入栈,并将原数除10得到tnum。直到个位数为偶数是终止分解,并从数tnum进行还原,注意在还原时需要每出栈一个数都乘以十在加上出栈的数。在最后再乘以10并加上之前的偶数,将结果输出。