从两个数组输出不同的元素

时间:2017-01-10 15:05:22

标签: c arrays

我正在尝试从两个数组输出不同的元素。所以如果我有一个数组A:{9, 0, 1}而B是{0, 8, 1},我需要输出一个包含在第一个集合中的元素,但不包含在第二个集合中:9不能想想我应该如何比较第一个数组中的所有元素和第二个数组。

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a[10],b[10],c,n,i,j;

    printf("enter a number: ");
    scanf("%d",&n);
    for(i=0;i<n;i++){
    printf("Enter a[%d]: ",i+1);
    scanf("%d",&a[i]);
    }
    printf("\n");
    for(j=0;j<n;j++){
    printf("Enter b[%d]: ",j+1);
    scanf("%d",&b[j]);
    }

    for (i = 0; i < n; i++) {
            printf("%d ", a[i]); }

            printf("\n");

    for (i = 0; i < n; i++) {
            printf("%d ", b[i]); }
            printf("\n");

return 0;
}

我想表达自己的想法,但我觉得这很愚蠢:

 for(i=0;i<n;i++){
        for(j=0;j<n;j++){
            if(a[i]!= b[j]){
                c=a[i];
            }
        }
    printf("%d ",c);
    }

4 个答案:

答案 0 :(得分:4)

使用二进制搜索可以轻松解决此问题。按照简单的步骤。

第1步:对第二个数组进行排序。

第2步:对于第一个数组的每个元素,二进制搜索第二个数组,如果不存在,则打印它,否则不要。

时间复杂度为 O(m log n),其中m是第一个数组的长度,n是第二个数组的长度。

答案 1 :(得分:2)

如果你想要一个更有效的解决方案,正如@Sumeet Singh所建议的那样,你可以用qsort对第二个数组进行排序,然后用bsearch(二分搜索)找到第一个数组中的类似元素。

您当前的解决方案是 O(N ^ 2)时间,大n时速度会非常慢,但使用此方法可以提高效率。

以下是我编写的一些代码,用于演示:

#include <stdio.h>
#include <stdlib.h>

#define NNUMBERS 10

void get_array_input(int array1[], int array2[], size_t *n);
void search_elements(int array1[], int array2[], size_t n);
void print_arrays(int array[], size_t n);
int cmp_func(const void *a, const void *b);

int main(void) {
    int array1[NNUMBERS], array2[NNUMBERS];
    size_t n;

    /* input from user */
    get_array_input(array1, array2, &n);

    printf("\nFirst array: ");
    print_arrays(array1, n);

    printf("\nSecond array: ");
    print_arrays(array2, n);

    /* sorting the second array */
    qsort(array2, n, sizeof(*array2), cmp_func);

    printf("\nSorted Second array: ");
    print_arrays(array2, n);

    /* the search begins */
    search_elements(array1, array2, n);

    return 0;
}

void get_array_input(int array1[], int array2[], size_t *n) {
    size_t i;

    printf("Enter n: ");
    if (scanf("%zu", n) != 1) {
        printf("Invalid n value.\n");
        exit(EXIT_FAILURE);
    }

    for (i = 0; i < *n; i++) {
        printf("Enter array1[%zu]: ", i);
        if (scanf("%d", &array1[i]) != 1) {
            printf("Invalud array value.\n");
            exit(EXIT_FAILURE);
        }
    }

    for (i = 0; i < *n; i++) {
        printf("Enter array2[%zu]: ", i);
        if (scanf("%d", &array2[i]) != 1) {
            printf("Invalud array value.\n");
            exit(EXIT_FAILURE);
        }
    }
}

void search_elements(int array1[], int array2[], size_t n) {
    size_t i;
    void *key;

    printf("\nElements in first array which are not in second array: ");
    for (i = 0; i < n; i++) {
        key = bsearch(&array1[i], array2, n, sizeof(*array2), cmp_func);
        if (!key) {
            printf("%d ", array1[i]); /* not found, so print it */
        }
    }
    printf("\n");
}

void print_arrays(int array[], size_t n) {
    size_t i;

    for (i = 0; i < n; i++) {
        printf("%d ", array[i]);
    }
    printf("\n");
}

/* cmp function needed for qsort and bsearch */
/* many ways to write these */
int cmp_func(const void *a, const void *b) {
    const int *num1 = (const int *)a;
    const int *num2 = (const int *)b;

    if (*num1 > *num2) {
        return +1;
    } else if (*num1 < *num2) {
        return -1;
    }
    return 0;
}

输入:

Enter n: 3
Enter array1[0]: 9
Enter array1[1]: 0
Enter array1[2]: 1
Enter array2[0]: 0
Enter array2[1]: 8
Enter array2[2]: 1

输出:

First array: 9 0 1

Second array: 0 8 1

Sorted Second array: 0 1 8

Elements in first array which are not in second array: 9

答案 2 :(得分:1)

你走在正确的道路上。您将从第一个数组中获取每个值,并与第二个数组中的每个值进行比较。

您现在需要做的是,只有在a[i]没有任何b[j]时才会打印unique=1。最简单的方法是设置一个标志(比如a[i])。您可以为此标记指定您认为合适的任何名称,但在这种情况下,我认为数字a是&#34;唯一的&#34;到数组a[i]。因此,在这种情况下,您首先要假设您在数组b中找不到a[i] == b[j],然后您尝试反驳您的假设。如果您在任何时候搜索到unique=0的实例,那么您的前提是错误的,因此您设置了a[i]

将此bb中的所有元素进行比较后,您会查看自己的旗帜。并根据您是否在a中找到此元素打印相应的消息。

请注意,这假设相同的值在BasicAuthentication中不会出现两次。

答案 3 :(得分:0)

我已经编辑了一点代码,这段代码为您提供了所需的输出:

#include <stdio.h>

int main(void){
        int a[10],b[10],c,n,i,j;
        int counter=0;
        printf("enter a number: ");
        scanf("%d",&n);
        for(i=0;i<n;i++){
                printf("Enter a[%d]: \n",i+1);
                scanf("%d",&a[i]);
        }
        printf("\n");
        for(j=0;j<n;j++){
                printf("Enter b[%d]: \n",j+1);
                scanf("%d",&b[j]);
        }
        for(i=0;i<n;i++){
                counter=0;
                for(j=0;j<n;j++){
                        if(a[i]!=b[j]){
                                counter++;
                        }
                }
                if(counter == n){
                        printf("%d ",a[i]);
                }
        }
        return 0;
}

让我们解释一下这段代码: 在最后一个嵌套的for循环中,外部循环从数组a中获取一个元素。内循环获取数组b的每个元素,以便将它与数组a中的元素进行比较。如果数组b的元素都不等于a的take元素,则counter将等于n(数组大小)。然后我们可以打印从a获取的元素(这意味着这个被采用的元素和数组b的所有元素之间没有匹配。