Java判断排列合法性代码

张开发
2026/4/14 18:25:20 15 分钟阅读

分享文章

Java判断排列合法性代码
好的我注意到你之前已经提供了题目和解题思路现在需要我重新用 Java 编写判断一个序列是否为 1 到 n 的排列的代码。 题目理解给定一个长度为 n 的序列判断它是否是 1 到 n 的一个排列即包含且仅包含 1~n 每个整数一次。 Java 代码实现import java.util.Scanner; public class PermutationChecker { public static void main(String[] args) { Scanner scanner new Scanner(System.in); // 读取测试用例数量 int T scanner.nextInt(); for (int t 0; t T; t) { int n scanner.nextInt(); int[] arr new int[n]; // 读取序列 for (int i 0; i n; i) { arr[i] scanner.nextInt(); } // 判断是否为排列 if (isPermutation(arr, n)) { System.out.println(Yes); } else { System.out.println(No); } } scanner.close(); } /** * 判断数组是否为 1 到 n 的排列 * param arr 待检查的数组 * param n 数组长度 * return true 如果是排列false 否则 */ private static boolean isPermutation(int[] arr, int n) { // 使用布尔数组标记数字是否出现过 boolean[] visited new boolean[n 1]; for (int num : arr) { // 检查数字是否在有效范围内 [1, n] if (num 1 || num n) { return false; } // 检查数字是否重复出现 if (visited[num]) { return false; } // 标记数字已出现 visited[num] true; } // 检查是否所有 1~n 的数字都出现了 for (int i 1; i n; i) { if (!visited[i]) { return false; } } return true; } } 代码特点高效算法时间复杂度O(n)空间复杂度O(n)核心逻辑使用布尔数组visited标记每个数字是否出现过检查数字是否在有效范围 [1, n] 内检查是否有重复数字确保所有 1~n 的数字都出现模块化设计将判断逻辑封装在isPermutation方法中主函数负责输入输出处理 测试示例输入3 5 1 2 3 4 5 5 1 2 3 4 4 5 1 2 3 4 6输出Yes No No⚡ 性能优化说明布尔数组 vs Set使用布尔数组boolean[]比HashSet更高效数组访问是 O(1) 时间复杂度内存占用更小提前返回一旦发现数字超出范围或重复立即返回false减少不必要的循环输入处理使用Scanner处理标准输入支持多测试用例 使用建议如果题目有严格的内存限制可以进一步优化// 使用位集代替布尔数组 java.util.BitSet bitSet new java.util.BitSet(n 1);对于大量数据输入可以使用BufferedReader提高效率代码已经考虑了边界情况数字超出范围数字重复缺少某些数字这段代码可以直接用于大多数在线判题系统如果需要根据具体的题目要求进行调整请告诉我具体的输入输出格式

更多文章