华为OD机试真题【乱序整数序列两数之和绝对值最小】

文章介绍了如何在一个无序整数序列中找到两个数,它们的和的绝对值最小。方法是先排序数组,然后对负数部分使用二分查找找到最接近的正数,计算绝对值并与已知绝对值进行比较。如果全是负数或全为正数,也有特定的处理方式。

1、题目描述

【乱序整数序列两数之和绝对值最小】
给定一个随机的整数(可能存在正整数和负整数)数组nums,请你在该数组中找出两个数,其和的绝对值(|nums[x]+nums[y1])为最小
值,并返回这个两个数(按从小到大返回)以及绝对值。
每种输入只会对应一个答案。
但是,数组中同一个元素不能使用两遍。
【输入描述】
一个通过空格分割的有序整数序列字符串,够1000个整数,且整数数值范围是[-65535, 65535]。
【输出描述】
两数之和绝对值最小值
【示例1】
【输入】

-1-37 511 15
【输出】
-352
说明
因为|nums[0] + nums[2]|=|-3+5|=2最小,所以返回-3 52。

2、解题思路

第一种方法是运用暴力递归的方式,依次将每两个数字求其和的绝对值,得到最小的一组即为答案。

两个数字的之和绝对值最小-定满足以下特征之-
●两个数字都负数,那么是最大的俩负数的和的绝对值最小。
●两个数字都是正数,那么是最小的俩整数的和的绝对值最小。
●一个数负数-个数是正数,此时情况需要特殊处理。因为需要绝对值最小,那么对于一个负数-N显然想找+N , 我们遇到一个负数x,要找非须数区的最接近于|x的的那个数。

所以解题思路了就很清晰了:将输入的整数数组排序Q,然后将问题转化为在数组的正数部分找到一个最接近给定负数的数的问题。这
样的问题可以通过二分查找来解决。从数组的负数部分开始遍历,然后在数组的正数部分使用一分查找找到一个最接近给定负数的正数。
后,我们需要比较所有可能情况得到的绝对值和,返回最小的一个。

3、参考代码

import java.util.Arrays;
import java.util.Scanner;

/**
 * @Author 
 * @Date 2023/6/11 23:15
 */
public class 乱序整数序列两数之和绝对值最小 {
   
   
    public static void main(String[] args) {
   
   
        Scanner in = new Scanner(System.in);
        while (in.hasNext()) {
   
   
            int[] nums = Arrays.stream(in.nextLine().split(" "))
                    .mapToInt(Integer::parseInt).toArray();

            getMinAbsSum(nums); // 方法一
            getMinAbsSum2(nums); // 方法二
        }
    }

    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值