华为OD机试之乱序整数序列两数之和绝对值最小(Java源码)

乱序整数序列两数之和绝对值最小

题目描述

给定一个随机的整数(可能存在正整数和负整数)数组 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。

解析

  1. 使用for循环暴力组合破解
  2. 将数分组 正数一组,负数一组 分组后排序
    2.1. 若全正,则找最小的两个 若全负 则找最大的两个
    2.2. 若正负结合,则合并两个列表 使用双指针进行求解
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
//-1 -3 7 5 11 15
public class T57 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		List<Integer> positiveNums = new ArrayList<Integer>();
		List<Integer> negativeNums = new ArrayList<Integer>();
		Arrays.stream(sc.nextLine().split(" ")).forEach(item -> {
			int num = Integer.parseInt(item);
			if (num < 0) {
				negativeNums.add(num);
			} else {
				positiveNums.add(num);
			}
		});
		positiveNums.sort((a, b) -> a - b);// 升序
		negativeNums.sort((a, b) -> b - a);// 降序
		//System.out.println(positiveNums);
		//System.out.println(negativeNums);
		if(positiveNums.size()==0) {
			//纯负数
			System.out.println(negativeNums.get(1)+" "+negativeNums.get(0)+" "+Math.abs(negativeNums.get(1)+negativeNums.get(0)));
		}
		if(negativeNums.size()==0) {
			System.out.println(positiveNums.get(0)+" "+positiveNums.get(1)+" "+Math.abs(positiveNums.get(0)+positiveNums.get(1)));
		}
		if(negativeNums.size()>0&&positiveNums.size()>0) {
			//组合 就得组合了 说不定负数那边前两个 正数那边前两个 亦或者 一正一负
			int min=Integer.MAX_VALUE;
			int minNumber=negativeNums.get(negativeNums.size()-1);
			int maxNumber=positiveNums.get(positiveNums.size()-1);
			if(negativeNums.size()>=2&&negativeNums.get(0)+negativeNums.get(1)<min) {
				min=Math.abs(negativeNums.get(0)+negativeNums.get(1));
				minNumber=negativeNums.get(1);
				maxNumber=negativeNums.get(0);
			}
			if(positiveNums.size()>=2&&positiveNums.get(0)+positiveNums.get(1)<min) {
				min=Math.abs(positiveNums.get(0)+positiveNums.get(1));
				minNumber=positiveNums.get(0);
				maxNumber=positiveNums.get(1);
			}
			//双指针
			int left=0;
			int right=1;
			List<Integer> numsList=new ArrayList<Integer>();
			numsList.addAll(negativeNums);
			numsList.addAll(positiveNums);
			while(left<numsList.size()-1) {
				right=left+1;
				while(right<numsList.size()) {
					if(min>Math.abs(numsList.get(left)+numsList.get(right))) {
						min=Math.abs(numsList.get(left)+numsList.get(right));
						minNumber=numsList.get(left);
						maxNumber=numsList.get(right);
					}
					//System.out.println(numsList.get(left)+"-"+numsList.get(right)+"-");
					right++;
				}
				left++;
			}
			System.out.println(minNumber+" "+maxNumber+" "+ min);
		}
	}
}

华为OD机试之乱序整数序列两数之和绝对值最小(Java源码)_第1张图片

你可能感兴趣的:(华为OD机试,java,算法,开发语言,华为od)