1 importjava.util.Arrays;2

3 /**

4 *5 *@authorAdministrator6 *7 */

8 public classTestUtil {9 private int[] arrysMin = null;10

11 private int[] arrysMax = null;12

13 private int matchNum = 0;14

15 private boolean hasMatched = false;16

17 /**

18 * 返回数组的所有元素的总和19 *20 *@paramarrays21 * 待计算数组22 *@return所有元素的总和值23 */

24 public int getArraySum(int[] arrays) {25 int sum = 0;26 if (null !=arrays) {27 for (inti : arrays) {28 sum +=i;29 }30 }31 returnsum;32 }33

34 /**

35 * 返回数组的差值36 *37 *@paramarray138 * 集合一39 *@paramarray240 * 集合二41 *@return差值42 */

43 public int getTowArraysMacth(int[] array1, int[] array2) {44 Integer l1 =getArraySum(array1);45 Integer l2 =getArraySum(array2);46

47 if ((l1 - l2) / 2 > 0) {48 arrysMax =array1;49 arrysMin =array2;50 return (l1 - l2) / 2;51 } else{52 arrysMax =array2;53 arrysMin =array1;54 return (l2 - l1) / 2;55 }56 }57

58 private boolean isReturn(int[] arrayMax, int[] arrayMin) {59 Integer l1 =getArraySum(arrayMax);60 Integer l2 =getArraySum(arrayMin);61

62 if ((l1 - l2) > 0) {63 return false;64 } else{65 return true;66 }67 }68

69 public voiddoMatch() {70 //保证大的数组总和永远是大的,以防递归进入死循环

71 if(isReturn(arrysMax, arrysMin)) {72 return;73 }74 //获取元素总和大的与小的差值平均值

75 int diff =getTowArraysMacth(arrysMax, arrysMin);76 //使用一个大数字初始化最小绝对值,后面做比较

77 int abs =getArraySum(arrysMax);78 int tempElement = 0;79 //最终大数组要交换的下标

80 int maxIndex = -1;81 int minIndex = -1;82 if (null != arrysMax && null !=arrysMin) {83 for (int i = 0; i < arrysMax.length; i++) {84 for (int j = 0; j < arrysMin.length; j++) {85 int temp = arrysMax[i] -arrysMin[j];86 if (temp > 0 && diff >temp) {87 //如果元素差值和元素总和大的与小的差值平均值正好相等,直接交换元素OK

88 if (Math.abs(diff - temp) == 0) {89 tempElement =arrysMin[j];90 arrysMin[j] =arrysMax[i];91 arrysMax[i] =tempElement;92 matchNum++;93 hasMatched = true;94 return;95 } else{96 //否则完全遍历,最终找出元素差值和总和差值平均值差距最小的两元素,

97 if (abs > Math.abs(diff -temp)) {98 abs = Math.abs(diff -temp);99 maxIndex =i;100 minIndex =j;101 }102 }103 }104 }105 }106 //如果没有找到匹配项,且在已变换的数组中找到了满足条件的变量,则继续递归

107 if (!hasMatched && (maxIndex != -1 || minIndex != -1)) {108 //交换差距最小的两元素

109 System.out.printf("第%d次交换, Max[%d]:%d, Min[%d]:%d\n", ++matchNum, maxIndex, arrysMax[maxIndex], minIndex, arrysMin[minIndex]);110 tempElement =arrysMin[minIndex];111 arrysMin[minIndex] =arrysMax[maxIndex];112 arrysMax[maxIndex] =tempElement;113 System.out.println("交换后Max数组:" +Arrays.toString(arrysMax));114 System.out.println("交换后Min数组:" +Arrays.toString(arrysMin));115 System.out.println();116 //递归

117 doMatch();118 }119 }120 }121

122 public intgetMatchNum() {123 returnmatchNum;124 }125

126 /**

127 *@paramargs128 */

129 public static voidmain(String[] args) {130 TestUtil tu = newTestUtil();131 int[] a1 = { 11, 2, 4, 6, 47};132 int[] a2 = { 4, 5, 8, 9, 2};133 System.out.println("交换前数组a1:" +Arrays.toString(a1));134 System.out.println("交换前数组a2:" +Arrays.toString(a2));135 //进行第一次分出,两元素的总和谁大谁小

136 tu.getTowArraysMacth(a1, a2);137 //开始进行处理交换

138 tu.doMatch();139 //打印交换结果

140 System.out.println("交换次数:" +tu.getMatchNum());141 System.out.println("a1数组元素和:" +tu.getArraySum(a1));142 System.out.println("a2数组元素和:" +tu.getArraySum(a2));143 System.out.println("交换后原数组a1:" +Arrays.toString(a1));144 System.out.println("交换后原数组a2:" +Arrays.toString(a2));145 }146 }

交换两个数组 差最小 java_如何交换两个等长整形数组使其数组和的差最小(C和java实现)...相关推荐

  1. HDOJ---1431 素数回文[素数筛选+ltoa函数(将长整形转换成字符数组)+打表]

    素数回文 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  2. 将两个数组中的数进行交换

    交换两个数组中的值 1.创造临时变量t. 2. 将第一个数组下边为0的值存入临时变量中,然后将第二个数组下标为0的值存入第一个数组中,最终将临时变量t的值存入第一个数组中.利用循环将数组中所有的值都进 ...

  3. 定义两个长度相同的整型数组,通过键盘输入给这两个数组赋值。编写程序交换这两个数组对应位置的数值,如数组a[] ={1,2,3,4,5},数组b[] = {6,7,8,9,10}

    定义两个长度相同的整型数组,通过键盘输入给这两个数组赋值.编写程序交换这两个数组对应位置的数值,如数组a[] ={1,2,3,4,5},数组b[] = {6,7,8,9,10},交换后,数组b[] = ...

  4. 最小成本排序:两种情况

    最小成本排序:两个数交换,这两个数相加,一组数全部交换成有序之后,累加和就是成本. 如何求出最小的成本,有一点难度,主要在于有两种情况的分析,一种是每个元素交换到正确位置(会形成一些闭合的圆),进行计 ...

  5. crontab 最小间隔_今天我间隔了:如何找到不在数组中的最小数字

    crontab 最小间隔 by Marin Abernethy 通过Marin Abernethy 今天我间隔了:如何找到不在数组中的最小数字 (Today I Spaced: how to find ...

  6. 找出一个二维数组中的鞍点,即该位置上的元素在该行最大,在该列最小,也可能没有靶点

    找出一个二维师数组中的鞍点,即该位置上的元素在该行最大,在该列最小,也可能没有靶点 思路: 找出某行最大数,再判断此数是否是所在列最小 代码: #include<stdio.h> int ...

  7. 牛客 Tree(最小深度总和)(两种方法求重心)难度⭐⭐⭐

    题目链接 牛妹有一张连通图,由n个点和n-1条边构成,也就是说这是一棵树,牛妹可以任意选择一个点为根,根的深度deprootdep_{root}deproot​​为0,对于任意一个非根的点,我们将他到 ...

  8. Python计算两个numpy数组的交集(Intersection)实战:两个输入数组的交集并排序、获取交集元素及其索引、如果输入数组不是一维的,它们将被展平(flatten),然后计算交集

    Python计算两个numpy数组的交集(Intersection)实战:两个输入数组的交集并排序.获取交集元素及其索引.如果输入数组不是一维的,它们将被展平(flatten),然后计算交集 目录

  9. Leetcode刷题 1441题: 用栈操作构建数组(基于python3和c++两种语言)

    Leetcode刷题 1441题: 用栈操作构建数组(基于python3和c++两种语言) ** 题目: ** 给你一个目标数组 target 和一个整数 n.每次迭代,需要从 list = {1,2 ...

最新文章

  1. 2012组策略自动部署wsus
  2. Eigen 模板库的简介
  3. CKedit在线编辑器
  4. UI基础:UILabel.UIFont
  5. 第九十六期:JavaScript 中的 4 个相等比较算法的介绍
  6. cesium加载entity图片缩放_Cesium中级教程4 – 空间数据可视化(二)
  7. firstchild.data与childNodes[0].nodeValue意思
  8. java 线程 john_教你Java开发中多线程同步技巧
  9. [LUOGU] P2886 [USACO07NOV]牛继电器Cow Relays
  10. SimpleUI 2.0 发布,采用element-ui+vue给django admin带来全新体验
  11. LIRe提供的图像检索算法的速度
  12. 用PLSQL将Excel数据导入到Oracle中
  13. 以业务流程为框架的企业组织设计
  14. [附源码]java毕业设计社区医院电子病历系统
  15. iphone尺寸大全对照表2021 iphone屏幕尺寸大全
  16. gzip already installed and latest version解决方法
  17. js正则表达式验证大全及常用字符的说明
  18. 程序的循环结构(for循环)
  19. 基于校园生活一体化管理系统的可行性分析
  20. Linux中ctrl+f2进入编辑模式后,localhost怎么输入密码都不对

热门文章

  1. 使用IntelliJ IDEA 2019.3.2 x64 远程连接oracle数据库
  2. SpringBoot入门到精通_第4篇 _开发三板斧
  3. vmware安装问题:Microsoft Runtime DLL安装程序未能完成安装
  4. python中__init__文件的运用_python中__init__.py文件的作用
  5. 计算机如何玩二十四点游戏,数学二十四点游戏有什么技巧吗?
  6. activiti动态办理人_安全生产许可证办理相关问题
  7. java下载json需要的包_jenkins 获取插件,下载插件提速,配置国内镜像
  8. 获取当前系统时间c语言,使用C语言获取当前系统的时间
  9. mysql 用户管理表_mysql用户管理
  10. linux自带浏览器如何更新,在deepin上安装edge浏览器后更新系统报错的解决方案