我试图找到在两个数组中重复的所有数字.. 例如:
array1[2]: 1,2
array2[2]: 1,5
重复的数字是1
,因此我们创建一个包含1
的新数组。
array3[2]: 1
我的代码是:
int func1(int *str, int *str2)
{
int i,j,temp,c[10];
for(i=0;i<*(str+i);i++){
for(j=0;j<*(str2+j);j++){
if(*(str+i) == *(str+j))
{
temp = *(str+i);
*(str+i) = temp;
temp = *(c+i);
return c[i];
}
}
}
return 0;
}
问题是什么?(逻辑上)
感谢。
答案 0 :(得分:3)
存在多个问题:
两个for
循环中的条件是奇数,可能是错误的。它们相当于:
for (i = 0; i < str1[i]; i++)
for (j = 0; j < str2[j]; j++)
您应该在功能界面中指定输入数组的大小。
str1
和str2
是不寻常的。技术上没有错,但可能不是一个好主意。这些名称应该保留给字符串,而不是整数数组。c
几乎没有使用,并且没有安全使用。if
语句正文的前两行通过str[i]
精心将temp
中的值复制回自身。if
语句正文的第三行将数组c
中未初始化的值复制到变量temp
。if
正文的最后一行返回未初始化的值。这增加了诸如以下的变化:
int func1(int *arr1, int num1, int *arr2, int num2, int *arr3)
{
int k = 0;
for (int i = 0; i < num1; i++)
{
for (int j = 0; j < num2; j++)
{
if (arr1[i] == arr2[j])
arr3[k++] = arr1[i];
}
}
return k;
}
请注意,此代码假定arr3
(数组,而不是指针本身)的大小与num1
和num2
的乘积一样大。如果两个数组都包含相同值的列表,则每对输出数组中将有一行arr3
,因此它可以使用num1 * num2
行。这指出代码不涉及抑制重复;如果你需要(你很可能),那么if
语句的主体需要搜索arr3
中的当前值以检查新值是否存在。添加另一个参数int siz3
以指示第三个数组的大小是明智的。如果空间不足,则可以返回-1作为错误指示。
编码算法是二次的(或者更准确地说,与乘积num1 * num2
成比例)。如果您知道数组在输入时排序,则可以将其减少为线性算法(与num1 + num2
成比例)。重复消除,它有点贵 - 它不像'立方'那么简单。如果您知道输入数组包含唯一值(没有重复项),则显然不需要重复删除。
答案 1 :(得分:1)
for(i=0;i<*(str+i);i++){
for(j=0;j<*(str2+j);j++){
错了。你正在应用'&lt;'条件是一个整数自身,因此循环条件中断。所以,循环永远不会运行。
为什么要使用这些冗余语句?
temp = *(str+i);
*(str+i) = temp;
另外,这是错误的
temp = *(c+i);
return c[i];
请尝试更多以纠正这些陈述。如果您不能再做,我会为您提供解决方案