C 如何查找数组中第二大的数字,但返回该值出现的最后一个索引?
我的实际问题是在数据集中找到频率第二高的数字。我正在初始化一个数组,该数组的大小是数据集中最大的数字,然后每当该数字出现在数据集中时,数组中相应的索引就会递增。如果两个以上的指数共享第二高频率,那么我需要返回较大的指数。我的代码在某些情况下会返回正确的答案,但并非所有情况下都会返回正确答案,而且我在逻辑中很难找到错误C 如何查找数组中第二大的数字,但返回该值出现的最后一个索引?,c,arrays,math,C,Arrays,Math,我的实际问题是在数据集中找到频率第二高的数字。我正在初始化一个数组,该数组的大小是数据集中最大的数字,然后每当该数字出现在数据集中时,数组中相应的索引就会递增。如果两个以上的指数共享第二高频率,那么我需要返回较大的指数。我的代码在某些情况下会返回正确的答案,但并非所有情况下都会返回正确答案,而且我在逻辑中很难找到错误 int secondFreq(int data[], int maxNum){ int highest = 0; int secondHighest = 0;
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;
}
在您的示例中,第二个'6'(索引11)将转到'else if(data[x]>data[secondHighest]),并将'secondHighest'更新为与'highest'相同。此逻辑无法处理存在多个最高值的情况。 要修复此问题,可以在其他“else if”(data[x]==data[highest])之前放置一个“else if”(数据[x]==data[highest]) 但是,如果您的数据集如下所示,您将获得另一个不正确的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) {
...
}
我将更改代码,使其更清晰易读,如下所示:
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) {
...
}
如果不是出于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;
}
int secondFreq(int data[],int maxNum)
{
double highestVal=data[0];//从第一个开始
//入口
int secondHighest=-1;//如果
//先打领带
int x;//用于循环索引
对于(x=1;x最高值){
highestVal=数据[x];
}
};
对于(x=1;x=数据[次高]){
次高=x;
}
}
返回最高+1;
}
更难搞乱,尽管它确实检查了两次。您的代码有两个问题:
highest=x
在数据[x]==数据[highest]
的情况下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
}
int secondFreq(int data[],int maxNum){
int最高=0;
int secondHighest,secondFlag=0;//secondFlag:是否已确定secondHighest,0:未确定,1(不是0):已确定
int x;
对于(x=1;x数据[最高]){
第二高=最高;
最高=x;
secondFlag=1;
}
else if(数据[x]==数据[最高]){
最高=x;
}
else if(secondFlag==0 | | data[x]>=data[secondHighest]){
次高=x;
secondFlag=1;
}
}
如果(第二个标志)
返回最高+1;
其他的
返回0;//所有元素都相同
}
使用调试器逐步完成该函数,调试器应该会告诉您变量何时错误。为什么在返回它时要将1添加到第二高的
中?您可以使用=
组合第二和第三个if
。您能给出一个产生错误结果的输入示例吗?您需要else if(data[x]==data[highest]){highest=x;}
。我做了更改以添加新的elseif语句。然后我尝试了您提供的数据集,我的函数返回了2(第一个索引+1),这将是正确的答案。我对代码所做的另一个更改是未初始化secondHighest。如果第二个else if从未执行,则此操作将失败。这发生在上面答案中指出的数据集中:(0-2)-(1-2)-(2-5)可能我遗漏了什么。我现在AFK,所以我回家后会检查。发现了错误!我刚刚错过了您在第一个if语句中将第二个标志设置为1的消息。它现在运行良好。感谢您帮助我解决此问题。