【问题标题】:How can I put the indexs in descending order in C++ without using std?如何在不使用 std 的情况下在 C++ 中按降序排列索引?
【发布时间】:2022-01-09 10:07:11
【问题描述】:

结果包含一个像 0,1,2,3,4,5,6,7 这样的索引,这些是玩家的数量,我使用 cin 来获得他们的分数,比如 10,0,2,0,9 ,0,23,0。 当他们的分数不为0时,我想按降序计算玩家的数量。 结果必须是 6,0,4 2。 我只能按降序排列。我该怎么做?

#include <iostream>

using namespace std;

int main ()
{ int results[8];

    for (int i=0; i<N;i++)
    { 
        cin >> results[i];
    } 
        
    int change;
    for( int i = 0; i < M-1; i++ )
    {
        for( int j = i+1; j < M; j++ )
        {
            if( results[i] < results[j] )
            {
                change = results[i];
                results[i] = results[j];
                results[j] = change;
            }

         }
    }
return 0;
}

【问题讨论】:

  • std::sort 使用自定义比较器?

标签: c++ arrays indexing


【解决方案1】:

如果您创建一个结构来保存玩家 ID 和得分,您的生活会轻松 10 倍:

struct Player
{
    int id;
    int score;
};

那么您需要做的就是在输出中对0 的分数进行排序并跳过:

int main()
{
    std::vector<Player> players{
        {0, 10},
        {1, 0},
        {2, 2},
        {3, 0},
        {4, 9},
        {5, 0},
        {6, 23},
        {7, 0}
    };

    std::sort(players.begin(), players.end(),
             [] (auto p1, auto p2) { return p1.score > p2.score; });

    for (const auto& player : players)
    {
        if (player.score != 0)
            std::cout << player.id << " ";
    }

    std::cout << std::endl;
}
6 0 4 2 

【讨论】:

  • 我不能使用结构体,因为玩家ID和积分是可变的。
  • @teki2021 您可以更改存储在structs 中的数据,因此您需要扩展您的陈述,以了解为什么您不能使用它们
  • 因为测试人员将测试我的程序并且它正在处理标准输入给出的数据。
  • 你可以通过设置 cin >> score 来填充数据;玩家[i].score = 得分;和玩家[i].id = i;
  • 当然你可以使用struct,我坚信你应该这样做。我对值进行了硬编码,因为读取值不是您要问的问题。阅读时使用vector::push_back 将元素推送到向量。
【解决方案2】:

如果您不能使用 stdcincout 除外),这几乎会变成 C 代码:

  • 读取每个输入,过滤掉零值。
  • 对于非零输入,遍历results 数组,使用results 数组中的索引访问inputs 数组中的值,如果该值小于当前输入,则停止。李>
  • 保留results 索引j,因为它将是您必须放置当前输入索引的位置。
  • 将所有元素从该索引移动到 results 数组的末尾,上移一个位置(即靠近数组末尾)。
  • 将当前输入的索引i 写入results[j]

[Demo]

#include <iostream>  // cin, cout

int main ()
{
    int inputs[8];
    int results[8];
    size_t results_size{0};

    for (int i = 0; i < 8; i++)
    {
        std::cin >> inputs[i];

        int current_input{inputs[i]};

        // Nothing to do with inputs equal to zero
        if (current_input == 0)
        {
            continue;
        }

        // Kind of upper bound in results
        int j{0};
        for (; j < results_size and current_input <= inputs[results[j]]; j++);

        // Make room for new index in results
        for (int k = results_size; k > j; k--)
        {
            results[k] = results[k-1];
        }

        results[j] = i;
        results_size++;
    }
    
    for (int i = 0; i < results_size; i++)
    {
        std::cout << results[i] << " ";
    }
    std::cout << "\n";

    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-05
    • 1970-01-01
    • 2022-01-21
    • 2014-04-30
    • 1970-01-01
    • 2023-03-24
    • 2012-10-15
    相关资源
    最近更新 更多