携手创作,共同成长!这是我参与「掘金日新计划 · 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并加上之前的偶数,将结果输出。