public static void demo1(int arr[]){
int length = arr.length;
int leftTotal = 0;
int rightTotal = 0;
for(int i=1;i<length;i++){
if(i==1){
leftTotal = arr[0];
for(int j=i+1;j<length;j++){
rightTotal += arr[j];
}
}else{
leftTotal = leftTotal+arr[i-1];
rightTotal = rightTotal-arr[i];
}
System.out.println("===>i="+i+"=====>leftTotal="+leftTotal+"=====>rightTotal="+rightTotal);
if(leftTotal == rightTotal){
System.out.println(arr[i]);
}
}
}
public static void splitFind(int arr[]){
int length = arr.length;
int head,tail,index;
head = 0;
tail = length - 1; //倒数第二个数组下标
index = length / 2;//中间位置
int total = 0; //计算出所有的数字之和
for(int i :arr){
total += i;
}
do{
int leftTotal = 0;
//计算出中间数左边的加和
for(int le = 0;le <index ;le ++){
leftTotal += arr[le];
}
//所有数字总和 - 中间数字的和
int doubleValue=(total - arr[index]);
if(leftTotal*2 <doubleValue){
head = index;
index = index + (length - index) / 2;
}else if(leftTotal*2 >doubleValue){
total = index;
index = head + (index - head) / 2;
}else{
System.out.println(index);
return ;
}
}while(index > head && index <tail);
}
以上算法除法和乘法运算优化为位移运算:
public static void splitFind2(int arr[]){
int length = arr.length;
int head,tail,index;
head = 0;
tail = length - 1; //倒数第二个数组下标
index = length >> 1;//中间位置
int total = 0; //计算出所有的数字之和
for(int i :arr){
total += i;
}
do{
int leftTotal = 0;
//计算出中间数左边的加和
for(int le = 0;le <index ;le ++){
leftTotal += arr[le];
}
//所有数字总和 - 中间数字的和
int doubleValue=(total - arr[index]);
if(leftTotal<<1 <doubleValue){
head = index;
index = index + (length - index) >>1;
}else if(leftTotal<<1 >doubleValue){
total = index;
index = head + (index - head) >>1;
}else{
System.out.println(index);
return ;
}
}while(index > head && index <tail);
}
2231



被折叠的 条评论
为什么被折叠?



