华为面试题(8分钟写出代码) 有两个数组a,b,大小都为n,数组元素的值任意,无序; 要求:通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小
来源:互联网 发布:钓鱼生成软件下载 编辑:程序博客网 时间:2024/06/04 19:45
先上代码
java代码:
public class MinDiff { public static void main(String[] args){ int[] aa={2,5,4,3,1,0}; int[] bb={7,9,8,10,6,11}; exchange(aa,bb); } static void exchange(int[] a,int[] b){ int n=a.length; int diff=0; for(int i=0;i<n;i++){ diff+=a[i]-b[i];//计算两组数的差 } for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ int tp=a[i]-b[j];//计算两组数中单个元素的差值 int t=tp-diff;//单个元素差值和数组的差值比较 if(t*tp<0){ //以此条件判断是否需要交换 int ex=a[i]; a[i]=b[j]; b[j]=ex; diff-=2*tp;//计算数据交换后两个数组的差值 } } } for(int i=0;i<n;i++){ System.out.println(a[i]+" "+b[i]); } }}
前两天在“算法与数据结构”微信公众号上看到了这一题,当时看了下面的评论,感觉我如果一直不准备这方面的知识,我估计也会首先想到排序。
但是,这题说数据是无序的所以排序一定不是正确的方法。我的想法也不是一气呵成的,算是一点点试出来的。以下是我的思路。
首先,把问题简化,如果a,b两个数组长度为2,这题怎么做(别排序)取a={1,2},b={5,3}?
我的思路:
1、分别计算a、b两个数组的元素之和suma和sumb,并求他们的差diff=suma-sumb(这里diff=-5);
2、对单个元素进行操作,a[0]-b[0]=1-5=-4,这里a[0]和b[0]的差值小于a数组和b数组整体的差,交换他们,此时,a={5,2},b={1,3},diff=3;
然后继续a[0]-b[1]=5-3=2,2<3=diff,交换a[0]和b[1],此时a={3,2},b={1,5},差值为diff=-1.到此,一次循环结束。
3、按照步骤2的方法,把数组a的元素从头到尾和b数组中所有元素比较,直到最后一个数组元素。
以上就是我的思路。这里还有个问题:如何保证交换后两数组的差值一定会减小?
我们设diff为数组和的差,singlediff表示单个元素的差。我们先列举几种情况:
1、diff=-5,singlediff=-4
2、diff=-5,singlediff=-7
3、diff=-5,singlediff=4
4、diff=5,singlediff=-4
5、diff=5,singlediff=7
6、diff=5,singlediff=4
关于差值的情况我们举出来了,但是问题的关键是如何求数据交换后的新的差值newDiff?
就像代码里那样:newDiff=diff-2*singlediff
用上面6组数据带入求newDiff然后就能得到规律:(singlediff-diff)*single<0时交换数据可以保证交换后的差值diff一定减小。
代码思路到此为止。
阅读全文
1 0
- 华为面试题(8分钟写出代码) 有两个数组a,b,大小都为n,数组元素的值任意,无序; 要求:通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小
- 华为面试题(8分钟写出代码) 有两个数组a,b,大小都为n,数组元素的值任意,无序; 要求:通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小
- 【华为】题目:有两个数组a,b,大小都为n,数组元素的值任意,无序; 要求: 通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小。
- 有两个数组a,b,大小都为n,数组元素的值任意,无序;要求:通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小
- 有两个数组a,b,大小都为n,数组元素的值任意,无序;要求:通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小
- 有两个数组a,b,大小都为n,数组元素的值任意,无序; 要求:通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小。
- 有两个序列a,b,大小都为n,序列元素的值任意整数,无序;要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。
- 有两个序列a,b,大小都为n,序列元素的值任意整数,无序;要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。
- 有两个序列a,b,大小都为n,序列元素的值任意整数,无序;要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。
- 有两个序列a,b,大小都为n,序列元素的值任意整数,无序;要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。
- 有两个序列a,b,大小都为n,序列元素的值任意整数,无序; 要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。
- 《数组-规划》 有两个序列a,b,大小都为n,序列元素的值任意整数,无序;要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小
- 有两个序列a,b,大小都有n,序列元素的值任意整数,无序; 要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b无素的和]之间的差最大。
- 有两个序列a,b,大小都为 n,序列元素的值任意整数,无序 通过交换a,b中的元素,使序列 a的和与序列b的和之间的差最小
- 每天学习一算法系列(29)(有两个序列a,b,大小都为n,序列元素的值任意整数,无序;要求:通过交换a,b 中的元素,使[序列a 元素的和]与[序列b 元素的和]之间的差最小)
- [微软]有两个序列a,b,大小都为n,序列元素的值任意整数,无序; 要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小
- [微软]有两个序列a,b,大小都为n,序列元素的值任意整数,无序; 要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小
- (递归法)有两个序列a,b,大小都为n,序列元素的值任意整数,无序; 要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。
- java.lang.NoClassDefFoundError: javax/mail/Message
- 浅谈require和import
- hash(二分+hash)使用map会tle
- Unity3D
- Idea Maven 整合ssm框架: SpringMVC+Spring+MyBatis
- 华为面试题(8分钟写出代码) 有两个数组a,b,大小都为n,数组元素的值任意,无序; 要求:通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小
- ffmpeg的工具ffplay.exe使用
- Git小结(入门篇)
- jscpd--前端代码重复率检测
- hdu 3966 Aragorn's Story
- 用Java实现二叉链表方式存储的二叉树
- 依赖注入
- servlet监听器
- 14 java里的udp网络编程