【问题标题】:find the n largest elements in an array找到数组中最大的 n 个元素
【发布时间】:2020-06-06 06:45:25
【问题描述】:

我有一个数组,我需要在数组中找到 n 个平局,例如 {1,2,3,3} 我需要程序返回两个 3

void print_winner(void)
{
    // TODO
    string arr[9];
    string name = "";
    int largest = 0;
    for (int i = 0; i < voter_count; i++)
    {
        if (largest<candidates[i].votes)
        {
            largest = candidates[i].votes;
            name = candidates[i].name;
        }

    }

    // arr[0] = name;
    printf("%s\n", name);
    return;
}

在此代码中,候选者是一个具有两个属性的结构:名称和投票 我需要程序打印得票数最高的名字,即使是 3-way tie

我在想我会遍历列表找到最大的 int,然后删除该 int 并再次遍历列表以查看是否有任何元素等于原始列表中的最大元素,如果是,则将名称添加到数组中并在结束打印所有名字

【问题讨论】:

  • 您建议的解决方案听起来不错。您在实施过程中发现了哪些困难?

标签: c c99


【解决方案1】:

通常好的编程方法是将问题分解并解决其各个部分。

在这种情况下,设置问题的一种方法是打印所有得分最高的人的姓名。但这个问题有点复杂。

另一种解决问题的方法如下:

  • 求最高分。
  • 找到最高分后,打印所有得分最高的人的姓名。

每个子问题都比较容易,应该一起解决问题。

我更喜欢教别人如何钓鱼,所以我不想通过在代码中为您实现解决方案来破坏或破坏您学习、改进和变得出色的机会。非常欢迎您要求澄清,但是,我非常愿意提供帮助:)。

【讨论】:

    【解决方案2】:

    我认为你只需要在找到具有最大票数的候选人后再次循环数组,以查找是否有其他候选人或更多候选人具有相同的票数。票数。无需删除记录。

    【讨论】:

      【解决方案3】:

      在您通过所有投票计数之前,您不知道largest 的投票计数。 当发现更大的largest 时,需要更正当前最大的名称。这样做:

      void print_winner_1(void)
      {
          // globals: candidates: array
          //          voter_count: size of array
      
          int largest = 0;
          for (int i = 0; i < voter_count; i++)
          {
              if (largest < candidates[i].votes)
              {
                  largest = candidates[i].votes;
              }
      
          }
          for (int i = 0; i < voter_count; i++)
          {
              if (largest == candidates[i].votes)
              {
                  printf("%s\n", candidates[i].name);
              }
      
          }
      }
      

      上面可以存储一个largest_first_i 以提高速度。

      完整收集中介结果:

      void print_winner_2(void)
      {
          // globals: candidates: array
          //          voter_count: size of array
      
          string names[9]; // Tie names.
          int name_count = 0;
          int largest = 0;
          for (int i = 0; i < voter_count; i++)
          {
              if (largest < candidates[i].votes)
              {
                  name_count = 0; // Reset list of ties.
                  largest = candidates[i].votes;
              }
              if (largest == candidates[i].votes)
              {
                  if (name_count == 9) { // More than 9 temporary (!) ties.
                      print_winner_1();
                      return;
                  }
                  names[name_count++] = candidates[i].name;
              }
      
          }
          for (int i = 0; i < name_count; i++)
          {
              printf("%s\n", names[i]);
          }
      }
      

      我做了一个有两个完整循环,一个立即收集领带。 第二种解决方案容易导致结果数组溢出(如果有超过 9 个候选者),比如在 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 23 23] 的情况下,第一个中间关系会溢出最大 == 0。

      第二个也不需要更快,因为您需要存储到names 并且每次增加largest。几乎是过早优化的情况。

      【讨论】:

        猜你喜欢
        • 2020-08-09
        • 2021-10-13
        • 2015-06-24
        • 2020-09-06
        • 1970-01-01
        • 2012-05-22
        • 2019-10-16
        • 2016-05-24
        • 2021-11-07
        相关资源
        最近更新 更多