赋值是创建一个方法,在一个int数组中找到第二大的偶数int。我被限制使用任何库中的任何方法。
这是我的代码适用于所有情况:
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时,我知道有重复。
是否有更高效的(更少使用运算符,使用更少的循环,更少的内存分配)方法来实现目标?如何改进代码的逻辑?如何整体改进我的代码? 我不喜欢我必须将幻数-1分配给secondLargestEven和largestEven,因为它们在技术上被命名为保持EVENS。使用循环将数组中的有效偶数整数分配给secondLargestEven和largestEven并然后继续搜索是否有效?提前谢谢。
答案 0 :(得分:4)
当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
答案 1 :(得分:0)
这是一种有趣的实施方式:
public static int secondLargestEven(int[] array) {
Set<Integer> evenSet = new TreeSet<>(Collections.reverseOrder());
for (int n : array) if (n % 2 == 0) evenSet.add(n);
return new ArrayList<>(evenSet).get(1);
}
这种方法非常低效(我无法看到它)但返回第二大偶数:)
仅当数组具有第二大偶数时,才能使用。