任务是创建一个方法,在一个整数数组中找到第二大偶数整数。我被限制使用任何库中的任何方法。
这是适用于所有情况的代码:
public static int getSecondLargestEven(int[] ary) {
int i;
aryLength = ary.length;
int largestEven = -1;
int secondLargestEven = -1;
for (i = 0; i < aryLength; i++) {
if (ary[i] % 2 == 0) {
if (ary[i] > largestEven) {
if (largestEven != -1)
secondLargestEven = largestEven;
largestEven = ary[i];
} else {
if (ary[i] != largestEven) {
if (secondLargestEven == -1 || ary[i] >= secondLargestEven) {
secondLargestEven = ary[i];
}
}
}
}
}
在调用方法之前,我要求数组有多个,否则没有方法调用。 所以,当 secondLargestEven == -1 时,我知道有一个重复项。
是否有更有效(更少使用运算符、更少使用循环、更少内存分配)的方法来实现目标?我怎样才能改进我的代码的逻辑?我怎样才能整体改进我的代码? 我不喜欢我必须将魔数(Magic Number) -1 分配给 secondLargestEven 和 largestEven,因为它们在技术上被命名为持有 EVENS。使用循环将数组中的有效偶数分配给 secondLargestEven 和 largestEven 然后继续搜索是否有效?提前致谢。
最佳答案
当 largest
和 second
变量等于 -1
时,您可以通过不显式检查情况来使代码更清晰。
只需在循环之前将这些变量设置为 Integer.MIN_VALUE
- 这与假设数组中有两个附加值排在所有其他值之前相同,并且它们都具有值Integer.MIN_VALUE
。
public static int secondLargestEven(int[] x) {
int largest = Integer.MIN_VALUE;
int second = Integer.MIN_VALUE;
for (int i = 0; i < x.length; i++) {
if (x[i] % 2 == 0) {
if (x[i] > largest) {
second = largest;
largest = x[i];
} else if (x[i] > second) {
second = x[i];
}
}
}
return second;
}
编辑——我想我会提出,您可以通过在循环内使用 continue
语句来删除一层嵌套,以跳过您有奇数整数的情况,尽管有些人会认为这比上面的代码更难理解。
这是一种权衡——您在循环内使用显式控制流(坏),但您删除了嵌套级别(好)。
public static int secondLargestEven(int[] x) {
int largest = Integer.MIN_VALUE;
int second = Integer.MIN_VALUE;
for (int i = 0; i < x.length; i++) {
if (x[i] % 2 != 0)
continue;
if (x[i] > largest) {
second = largest;
largest = x[i];
} else if (x[i] > second)
second = x[i];
}
}
return second;
}
只是一个有趣的想法......在 Haskell 中,这个函数可以写在一行中
import Data.List (sort)
secondLargestEven = (!! 1) . reverse . sort . filter even
或者,如果你想更有效率
import Data.List (sortBy)
import Data.Ord (comparing)
secondLargestEven = (!! 1) . sortBy (comparing negate) . filter even
关于java - 查找数组中第二大偶数整数的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26064595/