【问题标题】:k largest elements exercise from geeksforgeeks来自 geeksforgeeks 的 k 最大元素练习
【发布时间】: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)

Runtime Error

这些练习的问题是我不知道测试用例的输入数据,这会产生错误。下面你会发现我的代码,这很简单。也许您可以帮助我确定可能导致分段错误的原因。

#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;
}

【问题讨论】:

  • 您应该确保nk 小于1024
  • 你能看到程序运行时的输出吗?
  • @JL2210 是的,我已经用条件检查过了。
  • @4386427 不,我不能。我只会收到错误或成功消息。
  • @DainiusStankevicius 我建议您编辑问题并添加测试代码时收到的确切消息

标签: c arrays segmentation-fault


【解决方案1】:

这个网站似乎没有遵守他们的限制。

我登录并修改了代码以打印N&gt;1000。 N的值为20567

错误的答案。 !!!错误的答案

您的代码可能无法在多个测试用例 (TC) 中正常工作。

您的代码失败的第一个测试用例:

输入:

20567 18428

9737 16220 4527 21952 22174 12861 29801 8125 13670 9713 5742 14988 31137 21891 25646 18474 18286 30312 6105 19031 18587 15877 14546 29756 18364 24690 12129 16209 378 27774 16552 18302 8238 10483 1752 12929 5551 22299 14756 9871 18279 32386 23286 5182 16557 9726 7137 22434 24399 7661 3544 29878 11885 16318 29725 29438 25486 18099 18811 7275 12781 9700 20024 9087 26644 32648 12870 29873 2988 8560 12217 14099 26516 10964 10622 16434 16432 16210 8777 32574 8708 27444 8143 9067 32385 7410 20022 406 2846 22519 30665 32044 5803 1192 9457 30792 18658 419 30816 3867 64 23108 7056 8849 16915 18030 20332 30257 28883 22408 30029 25926 15541 30405 9255 29500 638 6313 7685 15180 3221 18889 14770 860 27229 30930 5305 30240 20929 8652 8592 18566 16145 16032 26129 20049 18188 8408 32297 16899 20286 6311 14036 17409 8332 3369 21833 217177 203030 23123030303/10603/106/19206 ........

它的正确输出是:

32768 32768 32766 32765 32761 32759 32757 32756 32756 32755 32754 32752 32747 32747 32747 32746 32743 32742 32741 32740 32739 32738 32738 32735 32735 32735 32733 32733 32732 32731 32730 32728 32728 32726 32726 32726 32725 32724 32719 32718 32718 32716 32714 32714 32708 32706 32706 32698 32694 32694 32691 32690 32690 32689 32688 32687 32684 32682 32676 32675 32672 32670 32663 32660 32658 32657 32657 32656 32651 32648 32646 32645 32644 32643 32638 32637 32637 32637 32637 32635 32632 32630 32630 32625 32625 32625 32623 32622 32622 32620 32619 32618 32616 32614 32614 32613 32613 32612 32608 32606 32606 32605 32598 32596 32593 32591 32589 32588 32586 32586 32586 32582 32582 32581 32580 32580 32579 32578 32574 32573 32571 32571 32567 32567 32566 32564 32564 32563 32562 32560 32560 32559 32559 32558 32555 32554 32552 32551 32551 32551 32550 32549 32549 32547 32547 32546 32544 32544 32543 32543 32540 32539 32538 32538 32537 32535 32533 32533 32533 32532 32531 32528 32527 32527 32526 32525 3 252........

你的代码的输出是:

哥特式

但是,如果数组ArrRes 的长度正确,则会出现以下错误

预期时间限制

提示:请优化您的代码并再次提交。

我把这留给你。

提示 - 使用 qsort 以获得更好的排序性能。

【讨论】:

  • 嗯,这很有趣。你是怎么赶上这么高的N的?我也试过了,但仍然出现分段错误。可以发布您的完整代码吗?
  • @DainiusStankevicius 你需要将数组的大小增加到&gt; 100000 然后你可以添加if((k &gt; n)|| (n&gt; 1000)) { printf("Gotya"); exit(1); }
  • 非常感谢。我也能赶上那么高的N。也感谢您的提示。我能够使用 qsort 提交有效的解决方案。你拯救了这一天!
  • @RishikeshRaje Cool... 竖起大拇指 :-)
【解决方案2】:

如果任意两点之间的绝对差是 K 的倍数,则直线上的一组点被定义为与某个 K 相关。给定 N (2

案例一:

对于如下提供的输入:

5 2

1

2

3

4

5

程序的输出将是:

3

1

3

5

案例 2:

对于如下提供的输入:

6 4

10

15

12

16

20

32

程序的输出将是:

4

12

16

20

32

#include

使用命名空间标准;

// 查找余数集的函数

int findSet(int arr[], int n, int k, int m) {

向量余数集[k];

// 计算余数集合数组

// 并根据余数推送元素

for (int i = 0; i

int rem = arr[i] % k;

remainder_set[rem].push_back(arr[i]);

}

//检查sizeof是否有余数集合

//等于或大于m

for (int i = 0; i

if (remainder_set[i].size() >= m) {

cout

for (int j = 0; j

cout

}

返回 1;

}

}

返回 0;

}

// 驱动程序

int main() {

int n,k;

cin>>n>>k;

int arr[n];

for(int i=0;i

cin>>arr[i];

int z;

int m = sizeof(arr)/sizeof(int);

for(int i=m;i>0;i--)

{

z=findSet(arr, n, k, i);

如果(z==1)

休息;

}

}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2015-10-06
  • 2016-04-12
  • 2021-06-04
  • 1970-01-01
  • 1970-01-01
  • 2013-09-25
  • 2020-12-28
  • 1970-01-01
相关资源
最近更新 更多