在Qt中查找文件中的第二个最大数字

时间:2014-05-17 05:12:55

标签: c++ qt qstring qtcore qlist

我是Qt的初学者,在下面的代码中,我找到了最大数字,但我也需要找到第二个最大数字。

int max;
max = List.at(0).toInt();

for(int i=1; i<List.size(); i++)
{
    if(List.at(i).toInt()>max)
        max = List.at(i).toInt();
    if(List.at(i).toInt()<max)
        max = List.at(0).toInt();
}

qDebug()<<"max val:"<< QString::number(max);
ui->textEdit->setText(QString::number(max));

3 个答案:

答案 0 :(得分:2)

最简单的方法是放弃你的概念并使用它;

QList<int> intList;
foreach (const QString &myString, list)
    intList.append(myString.toInt());

qSort(intList.begin(), intList.end(), qGreater<int>());
qDebug() << "MAX:" << intList.first();
qDebug() << "SECOND MAX:" << intList.at(1);

它比你的原始概念慢一点,O(n * log(n))平均值和O(n ^ 2)最坏情况下的复杂性类似于快速排序。其他类似的合并排序等可能会更慢。

但是,大多数时候使用Qt并不重要,因为Qt容器本身比它们的标准库容器慢,所以我认为这不是主要问题。如果是,您可以考虑切换到标准库并使用我将在下面修复的概念。

基本上,您将使用qSort按升序对内容进行排序。请注意,我应该first() convenience method获取第一个项目而不是原始尝试at(0)。它基本上是相同的,但更加不言自明。

如果您需要保留原始容器,可以复制它。

如果你真的想坚持原来的概念,我会写下这个:

的main.cpp

#include <QDebug>
#include <QStringList>

int main()
{
    QStringList List{"10", "7", "2"};
    int max, secondMax;
    secondMax = max = INT_MIN;

    foreach (const QString &string, List) {
        int i = string.toInt();
        if (i > max) {
            secondMax = max;
            max = i;
        } else if (i > secondMax) {
            secondMax = i;
        }
    }

    if (secondMax == INT_MIN)
        secondMax = max;

    qDebug() << "max val:" << max;
    qDebug() << "second max val:" << secondMax;

    return 0;
}

main.pro

TEMPLATE = app
TARGET = main
QT = core
SOURCES += main.cpp
CONFIG += c++11

构建并运行

qmake && make && ./main

输出

max val: 10 
second max val: 7

请注意,最好使用Qt的foreach而不是C样式迭代,因为毕竟你不需要索引。话虽这么说,它是未经测试的代码,但这个概念是有效的,所以把它伪装成你可能需要调整的伪代码。

这也不完全是你原来的概念,但我想我会这样做。

答案 1 :(得分:1)

尝试使用我的代码:

   int max,second_Max=0;
   max = List.at(0).toInt();
   for( int i=1; i<List.size(); i++)
       {
        if(List.at(i).toInt()>max && second_Max!=2) {
            max = List.at(i).toInt();
            second_Max++;
        }
    }

答案 2 :(得分:0)

为什么不是从升序到降序排序然后使用索引来获得最大值和次要值?

      int i, j;
      int temp;             
      int size = List.size(); 
      for(i = 1; i <= size; i++)
     {
          for (j=0; j < (size - 1); j++)
         {
               if (List.at(j+1).toInt() > List.at(j).toInt())     
              { 
                    temp = List.at(j).toInt();            
                    List.at(j).toInt() = List.at(j+1).toInt();
                    List.at(j+1).toInt() = temp;
               }
          }
     }