我是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));
答案 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)。它基本上是相同的,但更加不言自明。
如果您需要保留原始容器,可以复制它。
如果你真的想坚持原来的概念,我会写下这个:
#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;
}
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;
}
}
}