
本文详解如何在 java 中正确判断三个输入整数中是否存在任意两个数之和恰好为 20,重点修复原代码中数组长度误用、输入数量不足及双指针算法适配性等关键错误。
本文详解如何在 java 中正确判断三个输入整数中是否存在任意两个数之和恰好为 20,重点修复原代码中数组长度误用、输入数量不足及双指针算法适配性等关键错误。
原问题要求:读入三个整数 a、b、c,判断其中是否存在一对数(即两个不同位置的数)之和等于 20,输出 true 或 false。但提供的代码存在多个根本性错误,导致无法通过含负数的测试用例(如 -5 25 8),核心问题如下:
- 数组大小错误:声明 int[] arrayOfNumbers = new int[2]; —— 只能存 2 个数,但题目明确要求读取 3 个数(a, b, c);
- 循环边界与索引越界风险:for (int i = 0; i
- 算法前提不匹配:hasArrayTwoCandidates 使用双指针法,依赖排序后首尾逼近,该方法完全支持负数(如 -5 + 25 = 20),失败根源不在算法本身,而在于输入未完整读取——负数测试用例往往依赖第三个数参与配对,但程序根本没读它。
✅ 正确做法是:申请长度为 3 的数组,准确读入全部三个整数,再应用排序+双指针。以下是修正后的完整可运行代码:
import java.util.Arrays;
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int[] nums = new int[3]; // ✅ 正确:存储 a, b, c 共 3 个数
// ✅ 正确读取全部三个整数
for (int i = 0; i < nums.length; i++) {
nums[i] = scanner.nextInt();
}
int target = 20;
if (hasPairWithSum(nums, target)) {
System.out.println("true");
} else {
System.out.println("false");
}
}
// ✅ 通用双指针解法:支持负数、零、正数,时间复杂度 O(n log n)
static boolean hasPairWithSum(int[] arr, int sum) {
if (arr.length < 2) return false;
Arrays.sort(arr); // 升序排列
int left = 0;
int right = arr.length - 1;
while (left < right) {
int currentSum = arr[left] + arr[right];
if (currentSum == sum) {
return true;
} else if (currentSum < sum) {
left++;
} else {
right--;
}
}
return false;
}
}? 关键验证示例:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- 输入 1 2 3 → 所有两两和:3, 4, 5 → 输出 false ✅
- 输入 4 16 7 → 4 + 16 = 20 → 输出 true ✅
- 输入 -5 25 8 → -5 + 25 = 20 → 输出 true ✅(修复后可正确通过)
⚠️ 注意事项:
立即学习“Java免费学习笔记(深入)”;
- 不要试图用固定 if (a+b==20 || a+c==20 || b+c==20) 硬编码判断——虽简单,但丧失扩展性;本题虽仅 3 数,但掌握通用双指针思想对处理任意长度数组至关重要;
- Arrays.sort() 对含负数的数组完全安全,双指针逻辑在 sum target 时左移右指针(找更小加数),天然兼容负数区间;
- 始终校验输入规模(arr.length)再调用算法,避免空指针或越界。
总结:问题本质不是“负数不工作”,而是数据未完整摄入。严谨对待输入规格(3 个数 → 数组长度=3)、用标准库工具(Arrays.sort)、结合经典算法(双指针),即可稳健解决包括负数在内的所有合法输入场景。

















