在 C++ 中搜索动态分配数组中的出现次数
Posted
技术标签:
【中文标题】在 C++ 中搜索动态分配数组中的出现次数【英文标题】:Searching the number of occurrences in a dynamically allocated array in C++ 【发布时间】:2020-02-08 13:42:07 【问题描述】:这是我用来创建数组的方法。
int* createArray(int N)
int* array = new int[N];
for (int i = 0; i < N; i++)
int rand_num = rand() % 10;
array[i] = rand_num % 10;
return array;
这是我用来计算出现次数的方法 使用线性搜索的数组
int linearSearch(int* nums, int N, int val)
int count = 0;
for (int i = 0; i <= N; i++)
if (val == *nums)
count+=1;
return count;
这是主要方法。线性搜索方法甚至返回 1 虽然数组中有两个。我该如何解决这个问题?
int main()
int N = 5;
int* arr = createArray(N);
for (int i = 0; i < N; i++)
cout << *arr++ << " " << endl;
cout << linearSearch(arr, N, 1) << " " << endl;
return 0;
【问题讨论】:
这是为了教育目的,一些关于指针和搜索算法的课程吗? 另一个错误是您的循环在线性搜索中执行了N + 1
次。确保将 i <= N
更改为 i < N
请注意:一旦发布的答案指出您的代码中存在错误,您就不应修复该错误 - 因为这会使答案无效,即使它是“善意”发布的'。
rand_num % 10;
在int rand_num = rand() % 10;
之后有什么意义?请查看<random>
标头提供的现代功能,或者至少在main
中调用srand
。
【参考方案1】:
我认为您不会在函数 shearch 中增加 *nums。
所以你总是比较数组[0]。
【讨论】:
您是否像@Arden Coder 在顶部所说的那样将 i 是的,我做到了,我会的 天哪!我没有看到,但是当您在主“for”中打印时,指针会移到数组的末尾!因此,当您在 shearch 函数中增加指针时,您会内存不足!【参考方案2】:您的代码中至少有三个错误!两个在您的 linearSearch
函数中,其中 (a) 您不增加在 if (val == *nums)
行中指向的地址和 (b) 您在循环中使用 @987654323 去“超出数组末尾的一个” @(大小为N
的数组的最后一个元素有一个索引N-1
)。这是一个固定版本:
int linearSearch(int* nums, int N, int val)
int count = 0;
for (int i = 0; i < N; i++)
if (val == *nums++)
count += 1;
return count;
第三个问题也许更微妙。在您的主代码中,您首先将指针arr
分配给createArray
返回的地址,这里:
int* arr = createArray(N);
然后,在您的输出循环中,您修改(增加)该地址的值:
cout << *arr++ << " " << endl;
因此,当您稍后执行这行 linearSearch(arr, N, 1);
时,arr
的值将错误 - 您会得到未定义的行为,试图访问无效内存。
我建议在输出循环中使用 数组索引,如下所示:
for (int i = 0; i < N; i++)
cout << arr[i] << " " << endl;
请随时要求进一步澄清和/或解释。
【讨论】:
我已经按照您指出的那样编辑了上面的代码,但控制台仍然输出错误的值 @Brian - 请在发布答案时不要继续编辑您的问题! @Brian - 您需要所有三个更正 - 但在代码的“本地副本”中进行这些更正。 好的。您还有其他想法为什么输出错误的值吗? @Brian 在我的电脑上,代码现在将1 7 4 0 9 1
作为其输出 - 这是正确的(数组中只有一个 1 - 最后一个是搜索的结果)。跨度>
以上是关于在 C++ 中搜索动态分配数组中的出现次数的主要内容,如果未能解决你的问题,请参考以下文章