Java算法练习day3 一、游游的重组偶数Java代码import java.util.Scanner; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { // 纯数学运算实现 dep 函数和你C逻辑完全一样 public static int dep(int x) { int temp x; int k 0; // 保存最后一位数字 int last x % 10; while (temp 0) { int t temp % 10; // 找到第一个偶数位 if (t % 2 0) { // 计算 10^k int pow10 1; for (int i 0; i k; i) { pow10 * 10; } // 构造新数字和你C公式完全一样 int res x - t * pow10 last * pow10 - last t; return res; } temp / 10; k; } // 没找到偶数 return -1; } public static void main(String[] args) { Scanner in new Scanner(System.in); int q in.nextInt(); while (q-- 0) { int x in.nextInt(); if (x % 2 0) { System.out.println(x); } else { System.out.println(dep(x)); } } in.close(); } }分析逻辑非常清楚读到一个数据就判断一次如果是偶数直接返回是奇数判断后再返回1.Scanner 键盘输入读取多组整数数据--whileq--while (q-- 0) { int x in.nextInt(); if (x % 2 0) { System.out.println(x); } else { System.out.println(dep(x)); } }2.dep 方法处理奇数重组数字public static int dep(int x) { int temp x; int k 0; // 保存最后一位数字 int last x % 10; while (temp 0) { int t temp % 10; // 找到第一个偶数位 if (t % 2 0) { // 计算 10^k int pow10 1; for (int i 0; i k; i) { pow10 * 10; } // 构造新数字和你C公式完全一样 int res x - t * pow10 last * pow10 - last t; return res; } temp / 10; k; } // 没找到偶数 return -1; }例子x 123奇数最后一位last 3数字1 2 3从右找3 (奇) → 2 (偶)找到啦计算过程t 2偶数pow10 10十位公式123 - 210 310 - 3 2 123 -20 30 -3 2132逐行精解// 功能处理奇数 x返回交换后的新数没偶数返回-1 public static int dep(int x) { int temp x; // 临时备份 x用来逐位拆数字不破坏原数 x int k 0; // 记录当前正在看第几位从右数个位0十位1... int last x % 10; // 固定取出数字的最后一位后面要用来交换1. 循环从右往左一位一位检查数字while (temp 0) { // 只要还有数字没看完就继续 int t temp % 10; // 【关键】取出当前最右边的一位数字temp % 10永远取最后一位这是拆数字的标准写法if (t % 2 0) { // 如果这一位是偶数找到了2. 计算当前位的权重10 的多少次方int pow10 1; for (int i 0; i k; i) { pow10 * 10; }作用算出当前位代表多大个位10⁰ 1十位10¹ 10百位10² 100不用Math.pow()是避免浮点数精度出错3. 计算当前位的权重10 的多少次方int res x - t * pow10 last * pow10 - last t; return res; // 交换完成直接返回新数 }二、体操队形深度优先搜索import java.util.Scanner; public class Main { // 全局变量和 C 全局变量作用一样 static int ret; // 答案合法方案数 static int n; // 人数 static boolean[] vis; // 标记是否用过 static int[] arr; // 存储输入的数组 // DFS 深度优先搜索和你 C 的 dfs 完全一样 public static void dfs(int pos) { // 递归出口排完了所有人计数1 if (pos n 1) { ret; return; } // 遍历 1~n 尝试放每一个人 for (int i 1; i n; i) { if (vis[i]) continue; // 已经用过跳过 if (vis[arr[i]]) return; // 剪枝原题核心条件 vis[i] true; // 标记使用 dfs(pos 1); // 递归下一个位置 vis[i] false; // 回溯撤销标记 } } public static void main(String[] args) { Scanner sc new Scanner(System.in); // 初始化变量对应 C 全局变量 n sc.nextInt(); arr new int[n 1]; // 从 1 开始存方便和 C 对应 vis new boolean[n 1]; ret 0; // 读入数组 for (int i 1; i n; i) { arr[i] sc.nextInt(); } dfs(1); // 从第 1 个位置开始搜 System.out.println(ret); } }