【发布时间】:2022-01-15 02:19:15
【问题描述】:
所以我对编程和 C 语言非常陌生,我想找到最简单、最快和最有效的方法来计算一维数组的所有不同元素。这实际上是为了学校作业,但我已经被这个问题困扰了好几天,因为我的程序对于在线法官来说显然太慢了,而且它得到了 TLE。我使用过常规数组和使用 malloc 动态分配的数组,但都不起作用。
无论如何,这是它的最新代码(使用 malloc):
#include <stdio.h>
#include <stdlib.h>
int distinct(int *arr, int N){
int j, k, count = 1;
for(j = 1; j < N; j++){
for(k = 0; k < j; k++){
if(arr[j] == arr[k]){
break;
}
}
if(j == k){
count++;
}
}
return count;
}
int main(){
int T, N, i = 0;
scanf("%d", &T);
do{
scanf("%d", &N);
int *arr;
arr = (int*)malloc(N * sizeof(int));
for(int j = 0; j < N; j++){
scanf("%d", &arr[j]);
}
int count = distinct(arr, N);
printf("Case #%d: %d\n", i + 1, count);
i++;
}while(i < T);
return 0;
}
【问题讨论】:
-
对数组进行排序并检查是否有两个相同的连续元素
-
所以我对编程和 C 语言还很陌生 然后完全不用担心找到“[t]最快和最有效的方法”来做任何事情.了解如何编写既可读又可维护的代码,这样当您在两周内再次看到您编写的代码时,您不必花费 30 分钟来弄清楚编写它的白痴想要做什么。
-
你允许多大的值,
int可以保持任何值还是可以限制在某个范围内? -
不,正如我所写,您允许数组包含哪些值?例如,如果它们被限制在 0 到 100 之间,您可以制作一个计数器表,其中索引对应于某个遇到的值。但如果它们可以是 +/- 2^31 的任何值,那么这样的解决方案是不可行的。
-
你的实际目标不是找到最快的方法。这很困难,取决于处理器架构和特性以及其他因素。您的实际目标是使程序足够快以满足在线评委的要求。方法可能很简单:对数组进行排序。这将使相同的元素彼此相邻。然后查看数组,检查任何两个相邻元素是否相同。排序应该是 O(n log n),这意味着它所采取的步数与 n 乘以 log n 成正比,其中 n 是数组中的元素数……