所以有三个数组:- UserArray、UniqueArray 和 FrequencyArray。 ArraySize 是 UserArray 的大小。
#include<stdio.h>
int main()
{
int ArraySize;
scanf("%d",&ArraySize);
int UserArray[ArraySize],UniqueArray[ArraySize],FrequencyArray[ArraySize];
for(int i=0;i<ArraySize;i++)
{
scanf("%d",&UserArray[i]);
}
int SizeOfUniqueArray=0;
for(int i=0;i<ArraySize;i++)
{
int j;
for(j=0;j<i;j++)
{
if(UserArray[i]==UserArray[j])
{
break;
}
}
if(j==i)
{
UniqueArray[SizeOfUniqueArray]=UserArray[i];
SizeOfUniqueArray++;
}
}
int count=0,k=0;
for(int i=0;i<ArraySize;i++) {
if(UserArray[i]==UniqueArray[k])
{
count++;
if(i == ArraySize-1)
{
FrequencyArray[k]=count;
count=0;
k++;
if(k <= ArraySize)
{
i=0;
}
}
}
}
}
UserArray 是一个用户定义的数组,它存储整数,比如 1,2,3,4,8,4,3,1,5,6,7,1,2,6,2。 所以 ArraySize = 15。 UniqueArray 包含 UserArray 的唯一编号,意思是:- 1,2,3,4,5,6,7,8。 现在下面给出的代码是在 UserArray 中保存唯一数字频率的代码。 就像 UniqueArray 的第一个元素是 1。1 在 UserArray 中重复了 3 次,所以 FrequencyArray 的第一个元素是 3。但是这段代码在 FrequencyArray 中保存了垃圾值。 我想知道为什么? 为什么上面的程序会保存垃圾值?
我们可以通过这段代码将值保存在FrequencyArray中:-
for(int i=0;i<SizeOfUniqueArray;i++)
{
int count=0;
for(int j=0;j<ArraySize;j++)
{
if(UserArray[j]==UniqueArray[i])
{
count++;
}
}
FrequencyArray[i]=count;
}
最佳答案
我不确定您使用的算法是否可以获取 UniqueArray。在这里,我建议了一种替代算法。
下面的代码基于输入数字在 0 <= UserArray[i] <= MAXINT
范围内的假设.还有 MAXINT
不应该很大或需要太多内存。
#define MAXINT 100 // The maximum unsigned integer that is supported.
int FrequencyArray[MAXINT+1];
int main(void)
{
int ArraySize;
scanf("%d",&ArraySize);
int UserArray[ArraySize];
int UniqueArray[ArraySize];
for(int i=0;i<ArraySize;i++)
{
scanf("%d",&UserArray[i]);
}
for(int i=0;i<ArraySize;i++) {
FrequencyArray[UserArray[i]]++;
}
int k=0;
for (int i=0; i<=MAXINT; i++)
{
if (FrequencyArray[i]!=0)
{
UniqueArray[k++] = i;
}
}
int UniqueArraySize = k; // for further use or printing.
}
如果你需要支持负数元素,那么FrequencyArray
的转变是必需的。
如果MAXINT
变得非常大则此算法不适合,建议使用其他哈希算法。
关于c - 为什么频率阵列保存垃圾值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57985807/