`
mwei
  • 浏览: 121935 次
  • 性别: Icon_minigender_1
  • 来自: 抽象空间
社区版块
存档分类
最新评论

求数组的平衡点

    博客分类:
  • java
 
阅读更多
原文见:http://www.iteye.com/topic/600079
平衡点:比如int[] numbers = {1,3,5,7,8,25,4,20}; 25前面的总和为24,25后面的总和也是24,25这个点就是平衡点;假如一个数组中的元素,其前面的部分等于后面的部分,那么这个点的位序就是平衡点
要求:返回任何一个平衡点
思路:数组两边同时求和,只需一次遍历数组,统计求和次数count,如果count为数组长度-1,那么存在平衡点。
写篇日记,记录一下自己的代码:
bug是,{1,0,0,0,1}存在多个平衡点,下面的程序只能找到中间的0;{1,0,0,1}有2个平衡点,下面的程序却找不到。其他的bug还没有发现。
public static void getBalancePoint(int[] arg){
		if(arg==null){
			System.out.println("array is null...");
			return;
		}
		if(arg.length<3){
			System.out.println("array's length is smaller than 3...no balance...");
			return;			
		}
		if(arg.length==3){
			if(arg[0]==arg[2]){
				System.out.println("array's balance is : "+arg[1]);
			}else{
				System.out.println("array has no balance...");
			}
			return;
		}
		int totalHead=0; //前部分总和(假设数组下标小的部分表示前)
		int totalEnd=0; //后部分总和
		int head=0; //前部分的数组下标
		int end=arg.length-1; //后部分的数组下标
		boolean addHead=true; //是否累加前部分
		boolean addEnd=true; //是否累加后部分
		int addCount=0; //总共累加次数
		while(head<end){
			if(addHead){ //前部分依次累加
				totalHead+=arg[head];
				addCount++;
			}
			if(addEnd){ //后部分依次累加
				totalEnd+=arg[end];
				addCount++;
			}
			if(totalHead<totalEnd){ //只允许前部分累加
				head++;
				addHead=true;
				addEnd=false;
			}else if(totalHead>totalEnd){ //只允许后部分累加
				end--; 
				addHead=false;
				addEnd=true;
			}else{ //前后同时累加
				head++;
				end--;
				addHead=true;
				addEnd=true;
			}
		} //end while
		if(addCount==(arg.length-1)){ //存在平衡点
			System.out.println("array's balance is : "+arg[head]);
		}else{
			System.out.println("array has no balance...");
		}
	}



分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics