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

标签 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

最佳答案

您的代码有两个问题:

  1. data[x] == data[highest] 的情况下,您需要设置 highest = x;
  2. secondHighest 最初应该是未决的。

以下是修改示例:

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
}

关于c - 如何找到数组中第二大的数字,但返回该值出现的最后一个索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39283020/

相关文章:

c - 用户输入 - C(不允许某些字符)

c++ - errno 在不同系统上的位置

C -- (void*) 到 int

python - 计算 numpy 数组中长度不同的值的连续出现次数

javascript - D3.js 在线性刻度上使用序数刻度

math - 从正弦/余弦转换中恢复角度

c - 如何实现 objective-c 的Tea算法?

c - 一个数组的地址返回什么?

javascript - 数组中对象的最后一个索引

algorithm - 1a + 2a^2 + 3a^3 + ... + na^n 的 O(log n) 解