乱序整数序列两数之和绝对值最小(华为od考试)
题目描述
给定一个随机的整数数组(可能存在正整数和负整数)nums,
请你在该数组中找出两个数,其和的绝对值(|nums[x]+nums[y]|)为最小值
并返回这两个数(按从小到大返回)以及绝对值。
每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
输入描述
一个通过空格空格分割的有序整数序列字符串,最多1000个整数,
且整数数值范围是[-65535,65535]
输出描述
两个数和两数之和绝对值
示例一
输入
# -1 -3 7 5 11 15
输出
# -3 5 2
说明
因为|nums[0]+nums[2]|=|-3+5|=2最小,
所以返回-3 5 2
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main {
static int min = 10000000;
static int[] a = new int[3];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
String str = sc.nextLine();
String[] arr = str.split(" ");
List<Integer> list = new ArrayList<>();
for (String s : arr)
list.add(Integer.parseInt(s));
int[] used = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
used[i] = 1;
find(list, used, i, 0);
}
for (int n : a) {
System.out.print(n + " ");
}
}
}
private static void find(List<Integer> list, int[] used, int index, int cur) {
if (cur == list.size()) {
return;
}
for (int i = 0; i < list.size(); i++) {
if (used[i] == 1)
continue;
used[i] = 1;
if (min > Math.abs(list.get(index) + list.get(i))) {
a[0] = list.get(index);
a[1] = list.get(i);
a[2] = Math.abs(list.get(index) + list.get(i));
min = Math.abs(list.get(index) + list.get(i));
}
find(list, used, index, i);
used[i] = 0;
}
}
}