public class TestRide {
//第一种方法
public static long ride2(int[] data) {
int length = data.length;
long[] front = new long[length];// 下标i之前的数的积(不包括i)
long[] back = new long[length];// 下标i之后的数的积(不包括i)
front[0] = 1;
back[length - 1] = 1;
for (int i = 1; i < length; i++) {
front[i] = front[i - 1] * data[i - 1];
back[length - i - 1] = back[length - i] * data[length - i];
}
long result = back[0];
for (int i = 1; i < length; i++) {
long temp = front[i] * back[i];
if (temp > result) {
result = temp;
}
}
return result;
}
//第二种方法
public static long ride(int[] data) {
int pMin = 0; // 最小自然数数的下标
int sMax = 0; // 最大负数的下标
int sMin = 0; // 最小负数的下标
int sSize = 0; // 负数的个数
int zeroNum = 0; // 零的个数
int index = 0; // 要去掉的那一个数的下标
long result = 1; // n-1个数相乘的最大结果
boolean pflag = true;
boolean sflag = true;
for (int i = 0; i < data.length; i++) {
if (data[i] < 0) {
sSize++;
if (sflag) {
sMax = i;
sMin = i;
sflag = false;
continue;
}
if (data[sMax] < data[i]) {
sMax = i;
}
if (data[sMin] > data[i]) {
sMin = i;
}
} else if (data[i] >= 0) {
if (pflag) {
pMin = i;
pflag = false;
}
if (data[i] == 0)
zeroNum++;
if (data[pMin] > data[i]) {
pMin = i;
}
}
}
if (zeroNum > 1)
return 0;
if (sSize % 2 == 1) {
index = sMax;
} else if (sSize == data.length) {
index = sMin;
} else {
index = pMin;
}
for (int i = 0; i < data.length; i++) {
if(i == index) continue;
result *= data[i];
}
return result;
}
public static void main(String[] args) {
int[] data = new int[] { 5, 2, -5, 4, 9, -6, 1, 0, };
int[] data2 = new int[] { -5, -2, -5, -4 };
System.out.println(ride(data));
System.out.println(ride2(data));
System.out.println(ride(data2));
System.out.println(ride2(data2));
}
}
输出结果:
10800
10800
-40
-40