【发布时间】:2019-09-17 11:00:30
【问题描述】:
我正在做一个来自 geeksforgeeks.org 的“k 最大元素”练习
https://practice.geeksforgeeks.org/problems/k-largest-elements/0
任务:
给定一个包含 N 个正整数的数组,从数组中打印出 k 个最大的元素。输出元素应按降序打印。
输入:
输入的第一行包含一个整数 T,表示测试用例的数量。每个测试用例的第一行是 N 和 k,N 是数组的大小,K 是要返回的最大元素。每个测试用例的第二行包含 N 个输入 C[i]。
输出:
按降序打印最大的k个元素。
约束:
1≤T≤100
1 ≤ N ≤ 100(实际识别为 1000)
K≤N
1 ≤ C[i] ≤ 1000*
示例:
输入:
2
5 2
12 5 787 1 23
7 3
1 23 12 9 30 2 50
输出:
787 23
50 30 23
说明:
测试用例 1:数组中的第一个最大元素是 787,第二大元素是 23。
测试用例 2:3 数组中最大的元素是 50、30 和 23。
我已经构建了一个解决方案,该解决方案适用于初始测试用例,但后来引发了分段错误。我不明白我在哪里可以得到分段错误:
Runtime Error:
Segmentation Fault (SIGSEGV)
这些练习的问题是我不知道测试用例的输入数据,这会产生错误。下面你会发现我的代码,这很简单。也许您可以帮助我确定可能导致分段错误的原因。
#include <stdio.h>
static int Arr[1024], Res[1024];
int main()
{
int t=0;
scanf("%d", &t);
while(t--)
{
int n=0,k=0, i=0,j=0,z=0;
scanf("%d %d", &n, &k);
// if(n>1000)
// printf("Gotya");
for(i=0; i<n; i++)
{
scanf("%d", &Arr[i]);
}
i=0;
int max_l = 0, max_h = 1000, j_max = 0;
for(i=0; i<k; i++)
{
for(j=0; j<n; j++)
{
if(Arr[j] >= max_l)
{
max_l = Arr[j];
j_max = j;
}
}
Res[i]= max_l;
max_l = 0;
Arr[j_max] = 0;
j_max = 0;
}
for(z=0; z<k; z++)
{
printf("%d ", Res[z]);
}
printf("\n");
}
return 0;
}
【问题讨论】:
-
您应该确保
n和k小于1024。 -
你能看到程序运行时的输出吗?
-
@JL2210 是的,我已经用条件检查过了。
-
@4386427 不,我不能。我只会收到错误或成功消息。
-
@DainiusStankevicius 我建议您编辑问题并添加测试代码时收到的确切消息
标签: c arrays segmentation-fault