一、数字重排为偶数
题目描述
给定 q 组数据,每组输入一个正整数 x。要求重排 x 的数位,使其变为偶数并返回结果。若 x 本身已是偶数则直接返回;若无法通过重排得到偶数,返回 -1。
解题思路
判断一个数是否为偶数,只需看其个位数字。我们将输入视为字符串处理更为方便。
- 检查最后一位是否为偶数,若是则直接返回原串。
- 若否,从前往后遍历寻找第一个偶数位,将其交换至末尾。
- 若遍历结束仍未找到偶数位,说明无解,返回 -1。
#include <iostream>
using namespace std;
string solve() {
string str;
cin >> str;
int n = str.size();
// 检查最后一位是否为偶数
if ((str[n - 1] - '0') % 2 == 0) return str;
// 寻找第一个偶数位并交换到末尾
for (int i = 0; i < n - 1; i++) {
if ((str[i] - '0') % 2 == 0) {
swap(str[i], str[n - 1]);
return str;
}
}
return "-1";
}
int main() {
int q;
cin >> q;
while (q--) {
cout << solve() << endl;
}
return 0;
}
二、体操队形排列方案
题目描述
有 n 名队员(编号 1~n),每人有一个诉求 a[i],表示 i 号队员必须排在 a[i] 的前面。若 a[i] == i 则表示无特殊要求。求满足所有条件的排队方案总数。


