
本文介绍如何遍历整数数组,高效识别满足“一个数是另一个数的平方(或平方根)”的数值对,并分离出无法构成此类关系的孤立元素。
本文介绍如何遍历整数数组,高效识别满足“一个数是另一个数的平方(或平方根)”的数值对,并分离出无法构成此类关系的孤立元素。
在实际编程中,常需从一组整数中挖掘隐含的数学关系。本例要求:给定数组 int[] sample = {9, 4, 3, 2, 6, 1},输出两类结果:
-
Output 1:所有满足「a 和 b 构成平方-平方根对」的有序对(即
a² = b且a ≠ b,如2 → 4、3 → 9); -
Output 2:未参与任何此类配对的“孤立数”(如
1和6——1² = 1是自平方,不构成有效配对;6² = 36不在数组中,且无其他数的平方等于6)。
关键在于明确定义“有效配对”:仅当两个不同索引上的不同值满足 x² = y 时才视为一对(排除 1→1 这类自映射)。原代码中直接用 Math.sqrt() 判断易引入浮点精度误差,且逻辑冗余;更稳健的做法是只计算整数平方,再检查该平方值是否存在于数组中。
以下是优化后的完整实现:
import java.util.*;
public class SquareRootPairDetector {
public static void main(String[] args) {
int[] sample = {9, 4, 3, 2, 6, 1};
Set<integer> paired = new HashSet(); // 使用Set避免重复添加,提升查找效率
System.out.println("Output 1: Square-root pairs (x -> x²):");
for (int i = 0; i 1)
if (square != x && contains(sample, square)) {
System.out.println(x + " → " + square);
paired.add(x);
paired.add(square);
}
}
System.out.print("Output 2: Unpaired numbers: ");
boolean first = true;
for (int num : sample) {
if (!paired.contains(num)) {
if (!first) System.out.print(", ");
System.out.print(num);
first = false;
}
}
System.out.println();
}
// 辅助方法:高效判断数组是否包含某值(可替换为Stream或Set预处理进一步优化)
private static boolean contains(int[] arr, int target) {
for (int v : arr) {
if (v == target) return true;
}
return false;
}
}</integer>
运行输出:
Output 1: Square-root pairs (x -> x²): 2 → 4 3 → 9 Output 2: Unpaired numbers: 6, 1
✅ 注意事项与改进点:
-
避免浮点运算:原方案中
Math.sqrt()对非完全平方数返回小数,需额外取整和验证,易出错;本解法仅正向计算平方,逻辑更清晰、安全。 -
去重与效率:使用
HashSet存储已配对元素,contains()时间复杂度为 O(1),优于ArrayList.contains()的 O(n)。 -
边界处理:显式排除
x == x²(即x=0或x=1),符合题意中“pair of different numbers”的要求。 -
可扩展性:若数组很大,建议先将
sample转为Set预处理,使contains()恒为 O(1),整体时间复杂度从 O(n²) 降至 O(n)。
此方案兼顾正确性、可读性与工程实践性,适用于同类数学关系挖掘场景。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











