一、题目
给定一个整数序列(存在正整数和负整数)数组args,请你再该数组中找出两个数,其和的的绝对值(|args[X]+args[y]|)为最小值,并返回这个绝对值。数组中同一个元素不能使用两遍,每种输入只会有一个输出。
输入描述:
一个通过空格分割的整数序列字符串,最多1000个整数,且整数数值范围是-65535~65535.
输出描述:
两个数相加的最小绝对值
示例1:
输入
15 11 7 -3 -1 5
输出
2
二、编码和测试
1.个人代码
代码如下(示例):
Scanner sc = new Scanner(System.in);
String[] source = sc.nextLine().split(" ");
Set<Integer> num = new HashSet<>();
for (String s : source) {
num.add(Integer.parseInt(s));
}
List<Integer> number = num.stream().collect(Collectors.toList());
int count = -1;
for (int i = 0; i < number.size() - 1; i++) {
for (int j = i + 1; j < number.size(); j++) {
if (count == -1) count = Math.abs(number.get(i) + number.get(j));
count = Math.abs(number.get(i) + number.get(j)) > count ? count : Math.abs(number.get(i) + number.get(j));
}
}
System.out.println(count);
2.测试
测试如下(示例):
15 11 7 -3 -1 5
2
------------------
2 8 -5 -2 9 0
0
------------------
-3 -2 -1 0 1 2 3
0
------------------
-2 -1 3 4 6
1
测试用例全部通过。
总结
本题重点是要注意题目条件其和的绝对值最小以及同一个元素不能使用两遍,因此使用了Math类的abs函数取绝对值,使用Set自带去重的特性来去掉可能存在的相同元素,从而满足同一个元素不能使用两遍的条件,之后采用了双重for循环列举所有配对求和,再通过三元运算得到最小值。