查找数组中第二大偶数int的有效方法

时间:2014-09-26 16:56:14

标签: java arrays search int

赋值是创建一个方法,在一个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并然后继续搜索是否有效?提前谢谢。

2 个答案:

答案 0 :(得分:4)

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

答案 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);
}

这种方法非常低效(我无法看到它)但返回第二大偶数:)

仅当数组具有第二大偶数时,才能使用