`

java-32.通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小(两数组的差最小)。

 
阅读更多
import java.util.Arrays;

public class MinSumASumB {

	/**
	 * Q32.有两个序列a,b,大小都为n,序列元素的值任意整数,无序.
	 * 
	 * 要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。 
	 * 例如: 
	 * int[] a = {100,99,98,1,2,3}; 
	 * int[] b = {1, 2, 3, 4,5,40};
	 * 
	 * 求解思路: 
	 * 当前数组a和数组b的和之差为 A = sum(a) - sum(b) a的第i个元素和b的第j个元素交换后,
	 * a和b的和之差为 A' 
	 * =sum(a) - a[i] + b[j] - (sum(b) - b[j] + a[i]) 
	 * = sum(a) - sum(b) - 2 (a[i] -b[j]) 
	 * = A - 2 (a[i] - b[j]) 
	 * 设x = a[i] - b[j], 则交换后差值变为 A’ = A - 2x
	 * 
	 * 假设A > 0, 当x 在 (0,A)之间时,做这样的交换才能使得交换后的a和b的和之差变小,x越接近A/2效果越好,
	 * 如果找不到在(0,A)之间的x,则当前的a和b就是答案。 所以算法大概如下:
	 * 在a和b中寻找使得x在(0,A)之间并且最接近A/2的i和j,交换相应的i和j元素,重新计算A后,
	 * 重复前面的步骤直至找不到(0,A)之间的x为止。
	 */
	public static void main(String[] args) {
		MinSumASumB minSumASumB=new MinSumASumB();
		//int[] a = {100,99,98,1,2,3}; 
		//int[] b = {1, 2, 3, 4,5,40};
		//int[] a={3,5,10};
		//int[] b={20,25,50};
		int[] a={3,5,-10};
		int[] b={20,25,50};
		minSumASumB.swapToMinusDiff(a, b);
		System.out.println(Arrays.toString(a));
		System.out.println(Arrays.toString(b));
	}

	public void swapToMinusDiff(int[] a,int[] b){
		
		int sumA=sum(a);
		int sumB=sum(b);
		
		if(sumA==sumB)return;
		
		if(sumA<sumB){
			int[] temp=a;
			a=b;
			b=temp;
		}
		int curDiff=1;
		int oldDiff=Integer.MAX_VALUE;
		int pA=-1;
		int pB=-1;
		boolean shift=true;
		int len=a.length;//the length of a and b should be the same
		while(shift&&curDiff>0){
			shift=false;
			curDiff=sum(a)-sum(b);
			for(int i=0;i<len;i++){
				for(int j=0;j<len;j++){
					int temp=a[i]-b[j];
					int newDiff=Math.abs(curDiff-2*temp);
					if(newDiff<curDiff&&newDiff<oldDiff){
						shift=true;
						oldDiff=newDiff;
						pA=i;
						pB=j;
					}
				}
			}
			if(shift){
				int temp=a[pA];
				a[pA]=b[pB];
				b[pB]=temp;
			}
		}
		System.out.println("the min diff is "+oldDiff);
	}
	public int sum(int[] a){
		int sum=0;
		for(int each:a){
			sum+=each;
		}
		return sum;
	}
}

分享到:
评论

相关推荐

    protobuf--java-3.2.0.jar & protoc-3.2.0-windows-x86_32.exe

    开发者可以使用protoc编译.proto文件生成Java代码,然后在项目中引入protobuf-java-3.2.0.jar,进行数据的序列化和反序列化操作,实现高效的数据交换。在实际应用中,protobuf广泛用于微服务、RPC框架、数据库存储等...

    protobuf-java-3.5.1.jar+protoc.exe哦

    总的来说,protobuf是现代软件开发中一个重要的数据交换和序列化工具,其高效的性能和跨平台特性使其成为许多项目首选的数据序列化方案。protobuf-java-3.5.1.jar和protoc.exe的组合,为Java开发者提供了完整的...

    protobuf-java-3.5.1.jar

    描述中提到的"protoc.exe"是protobuf编译器,它能够将.proto文件转换为不同编程语言(如Java、C++、Python等)的源代码,使得我们可以在程序中方便地序列化和反序列化protobuf消息。这个.exe文件通常在Windows环境下...

    protobuf实例protobuf-java-2.4.1.jar

    protobuf是Google开发的一种轻量级的数据序列化协议,它允许开发者定义数据结构,然后生成...通过它,你可以创建自己的数据模型,并在Java应用程序中方便地进行数据序列化和反序列化,从而提高程序的性能和可维护性。

    java-json.jar.zip

    在IT行业中,JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛用于服务器与客户端之间的数据传输,因为它易于人阅读和编写,同时也易于机器解析和生成。Java中处理JSON的主要工具有很多,如Gson...

    netty5 google protoc-2.5.win与protobuf-java-2.5.0.jar.rar

    标题中的“netty5”指的是Netty 5,这是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。它主要用于Java平台,提供了丰富的网络API,支持TCP、UDP和HTTP等多种协议。...

    protobuf-java-3.0.0.tar.gz

    标题中的"protobuf-java-3.0.0.tar.gz"指的是Google Protocol Buffers(简称protobuf)的一个Java实现版本的压缩文件,版本号为3.0.0。Protocol Buffers是一种高效、灵活的数据序列化机制,类似于XML或JSON,但更小...

    protoc.exe和protobuf-java-2.5.0.jar集合

    接下来,`protobuf-java-2.5.0.jar`是protobuf的Java实现库,它包含了运行时支持代码,这些代码在生成的Java类中被引用,以实现protobuf消息的序列化和反序列化功能。当你在Java项目中使用protobuf时,你需要将这个...

    protobuf-java-3.11.2.zip

    6. **在Java开发中的应用**:protobuf在Java开发中广泛应用于网络服务(如gRPC)、数据持久化、配置文件和API交互等领域,特别是在需要高效数据交换的高性能系统中。 7. **protobuf-3.11.2内容**:压缩包中的...

    jackson-annotations-2.2.3.jar jackson-core-2.2.3.jar jackson-databind-2.2.3.jar

    开发者可以通过`ObjectMapper`方便地实现Java Bean到JSON和JSON到Java Bean的转换,极大地简化了数据交换的工作。 在实际应用中,这三个模块通常一起使用。`jackson-annotations` 提供了注解来增强序列化和反序列化...

    protobuf-java-3.4.0.zip

    Google Protocol Buffers(Protobuf)是Google开发的一种序列化数据的框架,用于高效地存储和传输结构化数据。 Protobuf的设计目标是跨平台、跨语言,并且可扩展,使其成为网络通信和数据存储的理想选择。在Java环境...

    json-lib-2.1.jar和struts2-json-plugin-2.1.8.1.jar

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛应用于Web开发中,它易于人阅读和编写,同时也易于机器解析和生成。在Java世界里,`json-lib-2.1.jar` 是一个用于处理JSON的库,它提供了一系列...

    protobuf-java-3.3.0.jar、 protobuf.exe

    2. protobuf-java-3.3.0.jar:这是protobuf的Java运行时库,包含Java API,用于在Java应用程序中进行protobuf的序列化和反序列化操作。 在实际开发中,protobuf的优势在于: - 数据紧凑:protobuf生成的二进制编码...

    jackson-all-1.9.0.jar,jackson-all-1.9.9.jar,jackson-all-1.9.11.jar

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,因其易于人阅读和编写,同时也容易让机器解析和生成,因此在现代Web服务中广泛应用。在Spring MVC中,将后端处理的结果以JSON形式返回给前端是常见...

    protobuf-java-2.5.0jar包

    4. 通信与数据交换:序列化的protobuf对象可以通过网络发送,接收方反序列化后即可恢复原始数据结构。由于protobuf的紧凑二进制格式,相比XML或JSON,传输更高效,占用的带宽更少。 protobuf-java-2.5.0.jar包的...

    eclipse 使用 protobuf-java-2.4.1.jar java

    总结来说,protobuf是一个强大的数据序列化工具,通过在Eclipse中集成protobuf-java-2.4.1.jar,开发者可以轻松地在Java项目中实现数据的序列化和反序列化,从而实现高效的数据交换和存储。同时,protobuf的跨语言...

    jackson-core-asl-1.9.13.jar和 jackson-mapper-asl-1.9.13.jar

    它提供了高效、灵活的JSON序列化和反序列化功能,使得在Java应用程序中与JSON数据交互变得非常方便。标题提到的"jackson-core-asl-1.9.13.jar"和"jackson-mapper-asl-1.9.13.jar"是Jackson库的两个关键组件,分别...

    protobuf-java-3.0.2.zip

    标题中的"protobuf-java-3.0.2.zip"是一个压缩包文件,包含了Google的Protocol Buffers(简称protobuf)的Java版本3.0.2的源代码。Protocol Buffers是一种高效的数据序列化协议,用于结构化数据的序列化,类似于XML...

    protobuf-2.5.0环境包+protobuf-java-2.5.0.jar

    标题中的"protobuf-2.5.0环境包+protobuf-java-2.5.0.jar"指的是一种用于数据序列化的开源库,Protocol Buffers(简称protobuf)是Google开发的一种高效、灵活的数据序列化机制。2.5.0是这个库的一个特定版本,这...

Global site tag (gtag.js) - Google Analytics