试图找到在两个数组中重复的数字

时间:2011-05-26 08:34:05

标签: c arrays pointers

我试图找到在两个数组中重复的所有数字.. 例如:

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

问题是什么?(逻辑上)

感谢。

2 个答案:

答案 0 :(得分:3)

存在多个问题:

  1. 两个for循环中的条件是奇数,可能是错误的。它们相当于:

    for (i = 0; i < str1[i]; i++)
        for (j = 0; j < str2[j]; j++)
    
  2. 您应该在功能界面中指定输入数组的大小。

  3. 在C中,您必须确保始终知道阵列的大小。
  4. 您应该在功能界面中指定输出数组。
  5. 由于您需要知道共同发现了多少个值,因此您需要从函数中返回该数字。
  6. 您选择的名称str1str2是不寻常的。技术上没有错,但可能不是一个好主意。这些名称应该保留给字符串,而不是整数数组。
  7. 您的本地数组c几乎没有使用,并且没有安全使用。
  8. 您的代码在找到匹配的第一对数字时返回,而不是所有可能的匹配。
  9. if语句正文的前两行通过str[i]精心将temp中的值复制回自身。
  10. if语句正文的第三行将数组c中未初始化的值复制到变量temp
  11. 然后if正文的最后一行返回未初始化的值。
  12. 这增加了诸如以下的变化:

    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(数组,而不是指针本身)的大小与num1num2的乘积一样大。如果两个数组都包含相同值的列表,则每对输出数组中将有一行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];

请尝试更多以纠正这些陈述。如果您不能再做,我会为您提供解决方案