面试题 16.21. 交换和

给定两个整数数组,找到一对数值进行交换,使交换后两个数组的元素和相等。如果存在这样的解决方案,则返回交换的数值,否则返回空数组。问题涉及到数组遍历和求和。
摘要由CSDN通过智能技术生成

给定两个整数数组,请交换一对数值(每个数组中取一个数值),使得两个数组所有元素的和相等。

返回一个数组,第一个元素是第一个数组中要交换的元素,第二个元素是第二个数组中要交换的元素。若有多个答案,返回任意一个均可。若无满足条件的数值,返回空数组。

示例:

输入: array1 = [4, 1, 2, 1, 1, 2], array2 = [3, 6, 3, 3]
输出: [1, 3]
示例:

输入: array1 = [1, 2, 3], array2 = [4, 5, 6]
输出: []
提示:

1 <= array1.length, array2.length <= 100000

/**
 * @param {number[]} array1
 * @param {number[]} array2
 * @return {number[]}
 */
var findSwapValues = function (array1, array2) {
    array1.sort();
    array2.sort();
    const sum1 = array1.reduce((pre, cur) => pre += cur, 0);
    const sum2 = array2.reduce((pre, cur) => pre += cur, 0);
    const d = Math.max(sum1, sum2) - Math.min(sum1, sum2);
    array1 = Array.from(new Set(array1));
    array2 = Array.from(new Set(array2));
    if (d % 2 === 1) {
        return [];
    }
    else {
        if (sum1 < sum2) {
            for (let i = 0; i < array2.length; i++) {
                for (let j = 0; j < array1.length; j++) {
                    if (array2[i] < array1[j]) {
                        break;
                    }
                    if (array2[i] - array1[j] === d / 2) {
                        return [array1[j], array2[i]];
                    }
                }
            }
        }
        else {
            for (let i = 0; i < array1.length; i++) {
                for (let j = 0; j < array2.length; j++) {
                    if (array1[i] < array2[j]) {
                        break;
                    }
                    if (array1[i] - array2[j] === d / 2) {
                        return [array1[i], array2[j]];
                    }
                }
            }
        }
    }
    return [];
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值