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
分享到:
相关推荐
3. **时间复杂度分析**:计算`s[]`和`t[]`的时间复杂度为`O(N)`,计算`p[]`的时间复杂度也为`O(N)`,再加上查找`p[]`中的最大值的时间复杂度`O(N)`,总的时间复杂度为`O(N)`。 #### 解法二:简化分析 **核心思想**...
【算法分析求最大公约数】涉及的是在编程领域中如何高效地找到两个正整数的最大公约数(Greatest Common Divisor, GCD)。本实验旨在通过C++编程语言,设计并分析不同算法的效率,同时结合时间复杂性的理论进行实际...
- **定义**: 给定一个数组,求所有连续子数组的和的最大值。 - **应用场景**: 在数据挖掘、模式识别等领域。 - **实现方法**: - 可以使用动态规划的方法求解。 #### 子阵和 -- 求sum{a[0..m-1][0..n-1]} - **定义...
当n变得非常大时,这个乘积会超出C++标准库中提供的整数类型的最大值。 为了处理这种高精度计算,我们需要自定义一种数据结构,通常称为“大数”类。这个类可以由一个数组表示,每个元素存储一个位或者是一个子块,...
该程序在一个预定义的二维数组中查找最大值,并返回该值所在的行标和列标。 **代码分析:** ```cpp main() { int a[4][3] = {{1, 2, 3}, {82, 56, 7}, {88, 63, 8}, {79, 93, 9}}; int i, j, max_i = 0, max_j =...
质因数分解法是将两个数分别分解成质因数的乘积,然后找出共同的质因数,将这些质因数相乘得到的最大值即为最大公约数。例如,a = p1^e1 * p2^e2 * ... * pn^en,b = q1^f1 * q2^f2 * ... * qm^fm,其中pi和qi是...
- 使用高精度除法算法计算这两个数的商和余数。 - 分别输出商和余数。 - **注意事项:** - 输入整数长度可达200位,需确保能正确处理每一位的除法操作。 - 第二个数的范围较小,只需关注第一位即可判断是否需要...
输入一个数组,将数组中的最大值与第一个元素交换,最小值与最后一个元素交换。 **知识点解析:** - **数组操作**:学习如何查找最大值和最小值。 - **数组交换**:使用临时变量交换数组中的元素。 - **算法设计**...
+ 问题描述:给出一个长度为N的数字串,要求使用K个乘号将它分成K+1个部分,使得这K+1个部分的乘积能够为最大。 + 解题思路:使用动态规划,通过状态转移方程推出所有状态的最优值,最后f[n,k]即为答案。 * 题目...
- 找出数组中两个连续子数组的和,它们的差值最小。 - **旋转排序数组的恢复(Recover Rotated Sorted Array)** - 数组被旋转了若干次,恢复其排序状态。 - **数组中除自身以外其余元素的乘积(Product of Array ...
这段代码使用了递归的方式来实现,基本思想是不断地用较小的数去除较大的数,直到两数相等时,则该数即为两数的最大公约数。 ### 4. lcm (最小公倍数) 最小公倍数(Least Common Multiple, LCM)是指能被几个给定...
4. 整数除法和取余运算在解决问题中的应用,如计算能剪出的 3 和 2 的段数。 5. 代码优化,例如通过预先处理特殊情况(n 或 n == 2 或 n == 3)来减少计算。 理解这些知识点有助于解决类似的优化问题,尤其是在资源...
7. **有序数组插入**:在已排序的数组中插入一个数,保持数组有序,可以使用二分查找降低时间复杂度。 8. **数列循环移位**:对数组进行左移或右移操作,涉及数组元素的重新排列。 9. **顺序查找**:在数组中搜索...
- **功能**:求组合数,即从n个不同元素中选取k个元素的方法总数。 - **实现**:通过递归或迭代计算组合数。 #### 9. 快速傅立叶变换(FFT) - **功能**:用于多项式乘法和数字信号处理等领域。 - **实现**:利用...
- 每层节点数的最大值为2^(h-1),其中h为树的高度。 - 深度为h的完全二叉树至少有2^(h-1)个节点。 **6.2.3 二叉树的存储结构** - **顺序存储**:对于完全二叉树,可以使用数组进行存储。 - **链式存储**:每个节点...
- **定义**:在算法设计过程中,数据范围是指题目所给定的数据规模,包括输入数据的最大值、最小值以及数量等。 - **作用**:理解数据范围有助于选择合适的算法及数据结构,避免时间复杂度过高导致超时。 ##### ...
在算法设计上,我们首先需要找到最小的质数k,然后不断用k去除目标数n,直到不能再整除为止,这时k就是n的一个质因数。之后,将n除以k得到新的n,重复这个过程直到n变为1。值得注意的是,当k大于n的平方根时,若n仍...
4. 将系数矩阵化为上三角矩阵的过程中,乘除法的运算次数等于n(n-1)/2,其中n是方程组的未知数数量。这是因为高斯消元法涉及n-1次行交换,每次行交换会涉及n-1次乘除法。 5. 回代求解阶段,从下往上依次求解未知数...
- **位数需求**:为了表示一个非负整数\(N\),在基数\(b\)下,我们需要\(\lceil \log_b (N+1) \rceil\)个数字位(大约\(\log_b N\)位,上下波动不超过1位)。 通过这些知识点的梳理,我们不仅可以了解到算法处理...