簡體   English   中英

數組找到第二高的值

[英]array find the second highest value

我有一個包含10個整數值的數組。 現在我想找出第二高的數字。我不應該使用任何java API。 一位采訪者向我提出了這個問題。 他想要邏輯。他的要求是,我不應該遍歷整個元素。 有沒有辦法在沒有遍歷的情況下實現結果? Travesing意味着遍歷數組中的所有元素。 我想了很久。最后我放棄了。 如果有人可以解釋,那就太好了。 我還詢問了排序。 他不希望對數組進行排序。

不,這完全不可能。 如果你沒有看所有的數據呢,你不可能知道的第二高值。

當然,您不必所有數據進行排序 ,這可能是您的面試官的意思 - 但您確實需要至少查看一次所有元素。 每個元素都有可能改變結果,因此需要進行檢查。

如果你不至少看一次每個元素,你就無法知道答案。 但是,如果您不關心,可以使用二進制搜索樹:

在計算機科學中,二進制搜索樹(BST)(有時也可稱為有序或有序二叉樹)是基於節點的二叉樹數據結構,具有以下屬性:[1]

節點的左子樹僅包含鍵小於節點鍵的節點。 節點的右子樹僅包含鍵大於或等於節點鍵的節點。 左右子樹也必須是二叉搜索樹。
資料來源: http//en.wikipedia.org/wiki/Binary_search_tree


你怎么會找到第二大元素?

從BST的形成方式來看,你知道最大的元素是最右邊的元素(從根節點開始,帶着正確的孩子,直到你無處可去)。


現在,如何確定第二大?
嗯,這可能不是最有效的方法,但讓我們在以下情況下將其分解:

  1. 最大的節點是樹根並且沒有子節點 - 沒有第二大元素,因為樹中只有一個節點

  2. 最大的節點是樹根(沒有右子) - 第二大元素是左子樹中最大的元素

  3. 最大元素不是樹根,而不是葉子(有一個左子) - 第二大元素是他的左子

  4. 最大的元素不是樹根,而是葉子(沒有孩子) - 第二大元素是他的父母

我相信你現在可以找出模式和一個簡單的算法:D

我知道這已經得到了解答,但我在想這樣的事情。

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

從技術上講,我不是遍歷整個數組而是遍歷長度的n-1,因為我將第一個值分配給最大值。 我相信還有其他方法,但這個似乎是面試官可能想要的。

邏輯是如此簡單,我已經在一個for循環中實現了這一點。

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

public static void main(String [] args){

    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);

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM