在数组中找到n个最大元素

问题描述 投票:0回答:3

我有一个数组,我需要在数组中找到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;
}

在此代码中,候选人是具有两个属性的结构:名称和投票我需要程序打印出票数最高的姓名,即使有三路平局也是如此

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

c c99
3个回答
1
投票

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


1
投票

编程中一种通常很好的方法是将问题分解并解决其单独的部分。

在这种情况下,解决问题的一种方法是打印所有分数最高的名称。但是这个问题有点复杂。

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

  • 查找最高分数。
  • 找到最高分后,打印所有最高分的名称。

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

我更喜欢教别人如何钓鱼,因此,我不想破坏或破坏通过在代码中为您实施解决方案而学习,改进和变得很棒的机会。非常欢迎您要求澄清,但是,我非常乐于提供帮助:)。


0
投票

直到您通过每个投票数,您才知道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);
        }

    }
}

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]);
    }
}

我做了两个完整的循环,一个立即收集了领带。第二种解决方案容易导致结果数组溢出,例如,在[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 23 23]的情况下,第一个中间关系将以最大== 0溢出。

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

© www.soinside.com 2019 - 2024. All rights reserved.