【问题标题】:Max numbers in a list列表中的最大数量
【发布时间】:2018-03-09 09:56:41
【问题描述】:

第一行有两个值 N 和 K。N 是在初始行之后的输入数,K 是要找出的最大数。

示例输入:

5 2

6

7

17

11

6

(5 行输入,正在寻找 2 个最大值)

示例输出:

17

11

由于某种原因,我只得到第一个输出,而不是第二个。

vector<long> vectorAddCheck(vector<long> x, long value){
    if(x.empty()){
        x.push_back(value);
    }
    else {
        for(int i = 0; i < x.size(); i++){
            if(x[i] < value){
                x[i] = value;
            }
        }
    }
    return x;
}


int main() {
    long numLines, numOutputs, temp;
    vector<long> outputList = {};
    cin >> numLines >> numOutputs;

    for(int i = 0; i < numLines; ++i){
        cin >> temp;
        outputList = vectorAddCheck(outputList, temp);
    }

    for(int i = 0; i < outputList.size(); i++){
        cout << outputList[i] << endl;;
    }
    return 0;
}

【问题讨论】:

  • 为什么不将它们全部添加到数组中,对其进行排序,然后剥离第一个 N?
  • 当向量的长度为 0 时,将值推送到向量,因此向量的长度最大为 1。
  • 得到std::partial_sort的罕见用例!
  • 睡眠不足让我无法思考。这使得这变得简单多了。谢谢! @tadman

标签: c++ vector input output


【解决方案1】:

由于vectorAddCheck 的实现,您的输出向量仅包含一个数字。如果向量为空,则添加一个项目,否则您要么替换它,要么只是跳过新项目。因此,您的向量将始终包含一个对象。

您可以通过将方法更改为以下实现来修复它:

vector<long> vectorAddCheck(vector<long> x, long value){
    if(x.size() < 2){
        x.push_back(value);
    }
    else {
        unsigned min = (x[0] < x[1]) ? 0 : 1;
        if (x[min] < value){
            x[min] = value;
        }
    }
    return x;
}

不过,更简洁的实现是可能的:

int main() {
    long numLines, numOutputs, temp;
    cin >> numLines >> numOutputs;

    set<long> numbers;
    for(int i = 0; i < numLines; ++i){
        cin >> temp;
        numbers.insert(temp);
    }


    for (set<long>::reverse_iterator it = numbers.rbegin(); it != numbers.rend(); ++it)
    {
        cout << *it << endl;

        --numOutputs;
        if (numOutputs == 0) {
            break;
        }
    }

    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-12
    相关资源
    最近更新 更多