Java 数组查找第二高的值

Java 数组查找第二高的值,java,Java,我有一个数组包含10个整数值。现在我想找出答案 第二高的数字。我不应该使用任何java API。这个问题是一位面试官问我的。他需要逻辑,他的要求是,我不应该遍历整个元素。有没有什么方法可以让我们在不穿越的情况下获得结果? Travesing意味着遍历数组中的所有元素。我想了很久,最后我放弃了。如果有人能解释,那就太好了。我还问了排序的问题。他不想对数组进行排序。不,这完全不可能。如果不查看所有数据,就不可能知道第二高的值 当然,你不必对所有数据进行排序,这可能是你的面试官的意思——但你确实需要至

我有一个数组包含10个整数值。现在我想找出答案 第二高的数字。我不应该使用任何java API。这个问题是一位面试官问我的。他需要逻辑,他的要求是,我不应该遍历整个元素。有没有什么方法可以让我们在不穿越的情况下获得结果?
Travesing意味着遍历数组中的所有元素。我想了很久,最后我放弃了。如果有人能解释,那就太好了。我还问了排序的问题。他不想对数组进行排序。

不,这完全不可能。如果不查看所有数据,就不可能知道第二高的值


当然,你不必对所有数据进行排序,这可能是你的面试官的意思——但你确实需要至少看一次每个元素。每个元素都有可能改变结果,因此需要检查。

如果不至少看一次每个元素,就无法知道答案。但是,如果您不关心这一点,您可以使用二进制搜索树:

在计算机科学中,二叉搜索树(BST)有时也称为有序或排序二叉树,是一种基于节点的二叉树数据结构,具有以下特性:[1]

节点的左子树仅包含键小于节点键的节点。 节点的右子树仅包含键大于或等于节点键的节点。 左子树和右子树也必须是二进制搜索树。
资料来源:


你将如何找到第二大元素

从BST是如何形成的,您知道最大的元素是最右边的元素(从根节点开始,取正确的子元素,直到您没有地方再去)


现在,如何识别第二大问题?
好吧,这可能不是最有效的方法,但让我们把它分解为以下几种情况:

  • 最大的节点是树根,并且没有子节点-没有第二大元素,因为树中只有一个节点

  • 最大的节点是树根(没有右子树)-第二大元素是左子树中最大的元素

  • 最大的元素不是树根,而是叶子(有一个左子元素)——第二大元素是他的左子元素

  • 最大的元素不是树根,而是叶子(没有子元素)——第二大元素是它的父元素


  • 我相信你现在可以找出模式和一个简单的算法了:D

    我知道这个问题已经得到了回答,但我想的是这样的

        double maxVal = array[0];
        for (int i=1; i < array.length; i++) {
            if (array[i] > maxVal) {
                maxVal = array[i];
            }
        }
    
    double-maxVal=array[0];
    for(int i=1;imaxVal){
    maxVal=数组[i];
    }
    }
    

    从技术上讲,我不是遍历整个数组,而是遍历长度的n-1,因为我将第一个值赋给max值。我相信还有其他方法,但这一种似乎是面试官想要的。逻辑非常简单,我已经在一个for循环中实现了这一点

    我给你我的程序,如果你想要算法,我也可以提供给你

    公共静态void main(字符串[]args){

    int[]arr={0,12,74,56,2,63,45};
    int f1=1,f2=0,temp=0;
    int num=0;
    
    对于(int i=0;i不遍历是什么意思?你必须检查数组中的每个值。不检查每个元素是不可能的。如果不遍历列表至少一次,你就不能这样做。也许你的面试官希望你只在一次迭代中完成。你想在不查看所有元素的情况下获得10个元素中的最高值吗?那就nds相当难。我认为,如果你不遍历整个列表至少一次,你会遗漏潜在的解决方案。你必须创建二元搜索树,它会给出这个数字。你必须访问下面的链接,这将有助于你理解。我怀疑这是一个诡计问题,看看你必须能够使用多少主干回到荒谬的要求我很确定Jon的粉丝群会投票支持他的所有答案:)你如何构建树而不至少遍历元素一次?你不能。正如有人所说,如果你不访问每个元素至少一次,你就不可能知道答案
        int[] arr={0,12,74,56,2,63,45};
        int f1=1,f2=0,temp=0;
        int num=0;
    
        for(int i=0;i<arr.length;i++){
            num=arr[i];
            if(f1<num)
            {
                temp=f1;
                f1=num;
                num=temp;
            }
            if(f2<num)
            {
                temp=f2;
                f2=num;
                num=temp;
            }
        }
        System.out.println("First Highest "+f1+" Second Highest "+f2+" Third "+num);
    
    }