乱序整数序列两数之和绝对值最小(华为od考试)

该代码实现了一个Java程序,用于解决华为OD考试中的一个问题:在给定的整数序列中找到两个数,使得它们的和的绝对值最小。程序通过遍历数组并使用回溯法来搜索最佳组合,存储最小绝对值和对应的两个数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

乱序整数序列两数之和绝对值最小(华为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;
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值