java - 查找数组中第二大偶数整数的有效方法

标签 java arrays search 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 时,我知道有一个重复项。

是否有更有效(更少使用运算符、更少使用循环、更少内存分配)的方法来实现目标?我怎样才能改进我的代码的逻辑?我怎样才能整体改进我的代码? 我不喜欢我必须将魔数(Magic Number) -1 分配给 secondLargestEven 和 largestEven,因为它们在技术上被命名为持有 EVENS。使用循环将数组中的有效偶数分配给 secondLargestEven 和 largestEven 然后继续搜索是否有效?提前致谢。

最佳答案

largestsecond 变量等于 -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/

相关文章:

java - 拦截源自 Tess4J 的控制台输出

java - 错误 : cannot assign a value to final variable

java - 查找排序数组中整数出现的边界的问题 (Java)

java - 在将搜索字符串指定到我的 EditText 后,如何开始在回收器 View 中搜索匹配项

java - 在字符串集中搜索字符串排列

javascript - 获取 JSON 对象内元素的路径

java - lucene中为不同的查询词分配不同的权重

java - 如何使用 JCommander 添加命令行参数依赖?

c# - 是否可以将字节数组转换为AudioClip?

c++ - 使用 [][] 运算符更改通用二维数组类的值