一、题目描述
给定一个随机的整数(可能存在正整数和负整数)数组 nums,请你在该数组中找出两个数,其和的绝对值(|nums[x]+nums[y]|)为最小值,并返回这个两个数(按从小到大返回)以及绝对值。
每种输入只会对应一个答案。
但是,数组中同一个元素不能使用两遍。
二、输入描述
一个通过空格分割的有序整数序列字符串,最多1000个整数,且整数数值范围是 [-65535, 65535]。
三、输出描述
两数之和绝对值最小值。
四、解题思路
- 定义变量 sum 初始化为 65535*2,用于保存当前最小的绝对值和;
- 定义数组 arr,长度为 2,用于保存找到的两个数的索引;
- 读取输入的整数序列字符串 dataList;
- 使用空格分割字符串 dataList,得到字符串数组 strArr;
- 创建一个 ArrayList list,用于存储转换后的整数;
- 遍历 strArr,将每个字符串转换为整数,并添加到 list 中;
- 使用 Comparator.naturalOrder() 对 list 进行升序排序;
- 使用两层循环遍历 list,对于每对不同的元素 nums[i] 和 nums[j](i < j):
- 计算它们的和的绝对值 temp = |nums[i] + nums[j]|
- 如果 temp <= sum,则更新 sum = temp,并将当前索引 i 和 j 存入数组 arr。
- 输出结果,即 list[arr[0]]、list[arr[1]] 和 sum。
五、Java算法源码
public static void main(String[] args) {
int sum = 65535 * 2;
int[] arr = new int[2];
Scanner sc = new Scanner(System.in);
String dataList = sc.nextLine();
String[] strArr = dataList.split(" ");
ArrayList<Integer> list = new ArrayList<>();
for (String str : strArr) {
list.add(Integer.valueOf(str));
}
list.sort(Comparator.naturalOrder());
for (int i = 0; i < list.size(); i++) {
for (int j = i + 1; j < list.size(); j++) {
int temp = Math.abs(list.get(i) + list.get(j));
if (temp <= sum) {
sum = temp;
arr[0] = i;
arr[1] = j;
}
}
}
System.out.println(list.get(arr[0]) + " " + list.get(arr[1]) + " " + sum);
}
六、效果展示
🏆本文收录于,华为OD机试2023(Java)
本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。