[英]find the n largest elements in an array
我有一個數組,我需要在數組中找到 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 路平局
我在想我會遍歷列表找到最大的 int,然后刪除該 int 並再次遍歷列表以查看是否有任何元素等於原始列表中的最大元素,如果是,則將名稱添加到數組中,最后打印所有名字)
通常好的編程方法是將問題分解並解決其單獨的部分。
在這種情況下,設置問題的一種方法是打印所有得分最高的人的姓名。 但這個問題有些復雜。
設置問題的另一種方法如下:
這些子問題中的每一個都更容易,並且應該一起解決問題。
我更喜歡教別人如何釣魚,所以我不想通過在代碼中為你實現解決方案來破壞或破壞你學習、改進和變得很棒的機會。 非常歡迎您要求澄清,但是,我非常願意提供幫助:)。
我認為你只需要在找到具有最大票數的候選人后再次循環數組,以查找是否有其他候選人或更多候選人具有相同的否。 票數。無需刪除記錄。
直到你通過了每一個計票,你才知道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
。 幾乎是過早優化的情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.