888. 公平的糖果棒交换
爱丽丝和鲍勃有不同大小的糖果棒:A[i] 是爱丽丝拥有的第 i 根糖果棒的大小,B[j] 是鲍勃拥有的第 j 根糖果棒的大小。
因为他们是朋友,所以他们想交换一根糖果棒,这样交换后,他们都有相同的糖果总量。(一个人拥有的糖果总量是他们拥有的糖果棒大小的总和。)
返回一个整数数组 ans,其中 ans[0] 是爱丽丝必须交换的糖果棒的大小,ans[1] 是 Bob 必须交换的糖果棒的大小。
如果有多个答案,你可以返回其中任何一个。保证答案存在。示例 1:
输入:A = [1,1], B = [2,2]
输出:[1,2]
示例 2:
输入:A = [1,2], B = [2,3]
输出:[1,2]
示例 3:
输入:A = [2], B = [1,3]
输出:[2,3]
示例 4:
输入:A = [1,2,5], B = [2,4]
输出:[5,4]
首先我们可以知道,因为题目保证肯定有结果,那么我们可以知道,他们的总和肯定可以平均分成两部分,他们多出来的肯定是能被二整除 。
举个栗子
甲同学有12元,乙同学有8元,要使他俩的钱数相同,我们应该怎样分?
我们中的脑回路可能是这样,1.他俩现在的钱各是多少?2.他俩的差是多少?3.把多余的这部分平均分给甲乙两位同学。4.问题解决。
代码如下,以下仅是本人的一些想法,有问题请指出,谢谢!!!若有更好的办法,欢迎留言。
var fairCandySwap = function(A, B) { let aSum=0,bSum=0;//分别统计A,B中糖果的总和 let cha ;//计算(A-B)/2的差为多少 let res = [];//待返回交换的值 let Alength = A.length,Blength = B.length; var i=0,j=0; A.sort((a,b)=>{//箭头函数的使用,es6中有介绍 return a-b; }); B.sort((a,b)=>{ return a-b; }); while((Alength>0)||(Blength>0)){//分别统计A,B中糖果的总和 Alength--; Blength--; if(Alength>-1){ aSum += A[Alength] } if(Blength>-1){ bSum += B[Blength]; } } cha = (aSum - bSum)/2;//求差 while(i<A.length&&j<B.length){ if(A[i]-B[j]>cha){ j++;} else if(A[i]-B[j]<cha){ i++;} else{ res.push(A[i]); res.push(B[j]); break; } } return res; };