如何在数组中找到第二大数字,但返回该值出现的最后一个索引?

时间:2016-09-02 01:20:12

标签: c arrays math

我的实际问题是找到频率第二高的数据集中的数字。我正在初始化一个数组,该数组是数据集中最大数字的大小,然后在数据出现在数据集中时递增数组中的相应索引。如果两个以上的索引共享第二高的频率,那么我需要返回更大的索引。在某些情况下,我的代码会返回正确的答案,但不是全部,我在逻辑中找不到错误。

int secondFreq(int data[], int maxNum){
    int highest = 0;
    int secondHighest = 0;
    int x;

    for(x = 0; x < maxNum; x++){
        if(data[x] > data[highest]){
            secondHighest = highest;
            highest = x;
        }
        else if (data[x] > data[secondHighest]){
            secondHighest = x;
        }
        else if (data[x] == data[secondHighest]){
            secondHighest = x;
        }
    }

    return secondHighest + 1;
}

以下是产生错误答案的数组示例。左边的数字是索引,右边的数字是存储在该索引中的值。我的函数返回12(第11个索引+ 1),但它应该返回5(第4个索引+ 1)。

    0 - 2
    1 - 2
    2 - 5
    3 - 2
    4 - 5
    5 - 4
    6 - 2
    7 - 2
    8 - 6
    9 - 4
    10 - 3
    11 - 6
    12 - 2
    13 - 2
    14 - 3

3 个答案:

答案 0 :(得分:1)

在您的示例中,第二个&#39;(索引11)将转到&#39;否则if(data [x]&gt; data [secondHighest])&#39;并更新&#39; secondHighest&#39;和最高的#39相同。该逻辑不能处理具有多个最高值的条件。 要修复,您可以输入其他if(data [x] == data [highest])&#39;在其他&#39;之前,如果&#39;。

但是,如果您的数据集如下所示,您将获得另一个错误的anwser:

0 - 2
1 - 2
2 - 5

我会将代码更改为更清晰易读,如下所示:

int secondFreq(int data[], int maxNum){
    int secondLargestValue = findsecondLargestValue(data);
    return findIndexofValue(data, secondLargestValue) + 1;
}

int findsecondLargestValue(int data) {
    ...
}

int findIndexofValue(int data, int value) {
    ...
}

答案 1 :(得分:1)

如果不考虑2次通过的效率考虑,(所以这不是最佳答案),我想说的是:

int secondFreq(int data[], int maxNum)
{
    double          highestVal = data[0];   // start with the first
                        // entry
    int             secondHighest = -1; // will send back 0 if everything
                    // ties for first
    int             x;      // for loop index

    for (x = 1; x < maxNum; x++) {
    if (data[x] > highestVal) {
        highestVal = data[x];
    }
    };
    for (x = 1; x < maxNum; x++) {
    if (data[x] != highestVal)
        &&((secondHighest == -1) || (data[x] >= data[secondHighest])) {
        secondHighest = x;
        }
    }


    return secondHighest + 1;
}

虽然它确实看了两次但是很难搞砸了。

答案 2 :(得分:1)

您的代码有两个问题:

  1. highest = x;
  2. 的情况下,您需要设置data[x] == data[highest]
  3. secondHighest应该暂时待定。
  4. 以下是一个示例修改:

    int secondFreq(int data[], int maxNum){
        int highest = 0;
        int secondHighest, secondFlag = 0;//secondFlag : Whether secondHighest has been determined, 0 : undetermined, 1(Not 0) : determined
        int x;
    
        for(x = 1; x < maxNum; x++){
            if(data[x] > data[highest]){
                secondHighest = highest;
                highest = x;
                secondFlag = 1;
            }
            else if (data[x] == data[highest]){
                highest = x;
            }
            else if (secondFlag == 0 || data[x] >= data[secondHighest]){
                secondHighest = x;
                secondFlag = 1;
            }
        }
    
        if(secondFlag)
            return secondHighest + 1;
        else
            return 0;//All elements same
    }