不使用if else或三元运算符的三个数字中的第二个最大数字。使用最大和最小功能

时间:2017-08-16 13:33:55

标签: java arrays

void cal(int a,int b,int c)
 {
        int x=Math.max(a,b);
        int y=Math.max(b,c);
        int z=Math.max(a,c);
        int z1=Math.max(x,y);
        int z2=Math.max(z1,z);
        System.out.print("2nd max"+z2)
  }

以上代码用于使用max和min函数查找3个数字中的第二个最大数字。是否存在任何快捷代码,只有使用max和min函数才能找到if else或ternary运算符。

6 个答案:

答案 0 :(得分:4)

获得第二名的简单解决方案

a+b+c - Math.max(Math.max(a,b),c)- Math.min(Math.min(a,b),c)

我们希望在中间找到元素。因此,我们找到所有三个值的最大值和最小值:

int maximum = Math.max(Math.max(a,b),c)
int minimum = Math.min(Math.min(a,b),c)

我们现在可以通过查找所有元素与最小值和最大值之间的差异来获取中间元素,即缺失元素。

int allElements = a + b + c;
int minAndMax = maximum + minimum;
int difference = allElements - minAndMax

difference现在是中间的元素,第二个最大值。

答案 1 :(得分:1)

在数组中添加元素,然后对数组进行排序。在你的情况下像:

Integer[] array = {a,b,c};
Arrays.sort(array);
return array[array.length-2];

答案 2 :(得分:1)

您可以找到最大值,将其删除,然后再次找到它。这种方法的优点是它也适用于任意多个输入。

void cal(int a, int b, int c) {
    ArrayList<Integer> values = new ArrayList<>(3);
    values.add(a);
    values.add(b);
    values.add(c);

    Integer maxValue = Collections.max(values);
    // Remove object, not index
    values.remove(maxValue);

    int secondMax = Collections.max(values);
    System.out.print("2nd max" + secondMax)
}

或者对于只有3个元素,您可以简单地对其进行排序(如@panagdu建议的那样)。 不会增加开销,因为在找到第二个最大数字后,您已经知道了3个元素的完整订单

void cal(int a, int b, int c) {
    int[] values = new int[] {a, b, c};

    // Sorts in-place using efficient sorting algorithms
    Arrays.sort(values);

    // The first element is now the smallest, the last the biggest,
    // we take the element in the middle
    System.out.print("2nd max" + values[1]);
}

使用Java 8,您还可以使用Stream,它们具有可以轻松并行执行的优势。但我怀疑这有助于排序3个元素......无论如何,这是一个片段:

void cal(int a, int b, int c) {
    int value = IntStream.of(a, b, c).sorted().toArray()[1];

    System.out.print("2nd max" + value);
}

答案 3 :(得分:0)

您可以在处理最大值的第一个流中识别,并在第二个流中通过过滤第一个值来处理第二个最大值:

void cal(int a,int b,int c){

  final int[] values = new int[]{a, b,c};

   int max = Arrays.stream(values)
    .max().getAsInt();

   int secondMax = Arrays.stream(values)
        .filter(i -> i < max).max().getAsInt();      
}

答案 4 :(得分:0)

首先,您应该注意Java API Math.max该方法还使用if检查来查找最大值。

您可以对三个int值进行流式处理以排序并找到第二个最大值,如下所示:

void cal(int a, int b, int c) {
    int secondMax = Arrays.asList(a, b, c).stream().
                      sorted().mapToInt(num -> num).toArray()[1];
    System.out.println(secondMax);
}

答案 5 :(得分:0)

添加到List并删除最大值和最小值。

static int secondGreatestNumber(int a, int b, int c)
{
    List<Integer> numbers = new ArrayList();
    numbers.add(a);
    numbers.add(b);
    numbers.add(c);


    numbers.remove(new Integer(Math.max(a, Math.max(b, c))));//remove max value
    numbers.remove(new Integer(Math.min(a, Math.min(b, c))));//remove min value

    return numbers.get(0);
}