C语言中的乱序数组

时间:2014-04-04 22:21:33

标签: c arrays

我是C的新手!所以我得到两个相等长度的整数数组作为输入和一个len,它总是等于两个数组的len。我应该验证数组A中的整数是否等于数组B中的整数,顺序无关紧要。

例如,以下是可以的:

A[:)] = {1,2,3}
B[:(] = {3,2,1}

但以下情况并不好:

A[:)] = {1,1,1}
B[:(] = {1,2,3}

这是我在下面的代码,我在main.c中放了一个示例测试。但是,我的代码无法产生正确的答案。但我不知道为什么,我想知道是否有人可以帮助指出我哪里出错了。提前谢谢!

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

//flag = 1 means the two arrays are equal, or empty
//flag = 0 means that the two arrays are not equal

int scrambled( int a[], int b[], int len)
{
    int i = 0;
    int j = 0;
    int flag = 0;

    if (len == 0)
    {
        return 1;
    }

    for(i = 0; i < len; i++)
    {   
        flag = 0;

        for( j = 0; j < len; j++)
        {
            if( a[i] == b[j])
            {
                flag = 1;
            }
        }

        if(flag == 0)
        {
            printf("Number not found\n");
            return flag;
        }

    }

    printf("Here is flag: %d\n", flag);
    return flag;
}

int main()
{
    int array[100] = {1,1,1};
    int array2[100] = {1,2,3} ;

    int len = 3;

    scrambled(array,array2,len);
}

6 个答案:

答案 0 :(得分:5)

您的代码仅检查[]中是否存在[]中的每个数字,而不是相反。 a []只包含1 - &gt; {1,1,1}。它会检查所有三个1和b []以及每次在b []中找到1。

代码还应检查b []中的每个数字是否都存在于[]中。如果你添加它,那么你的代码就完成了。

这可行..(请注意,对于大型数组,冒泡排序很慢!)

#include <stdio.h>

static void bubble_sort_ints(int a[], int len)
{
    int i, j, t;
    for (i = 0; i < len - 1; i++) {
        for (j = i + 1; j < len; j++) {
            if (a[i] > a[j]) {
                t = a[i];
                a[i] = a[j];
                a[j] = t;
            }
        }
    }
}

static int scrambled(int a[], int b[], int len)
{
    bubble_sort_ints(a, len);
    bubble_sort_ints(b, len);

    int i;
    for (i = 0; i < len; i++) {
        if (a[i] != b[i]) {
            return 0;
        }
    }
    return 1;
}

int main(void)
{
    int a[5] = {1, 2, 2, 2, 3};
    int b[5] = {1, 1, 2, 3, 3};

    printf("%s\n", scrambled(a, b, 5) ? "ok" : "not ok");
    return 0;
}

答案 1 :(得分:2)

int scrambled( int a[], int b[], int len){
    int i, j, flag;
    char flags[len];

    if (len == 0) return 1;
    memset(flags, 0, len);
    for(i = 0; i < len; ++i){
        flag = 0;
        for( j = 0; j < len; ++j){
            if( a[i] == b[j] && flags[j]==0){
                flags[j] = flag = 1;
                break;
            }
        }

        if(flag == 0)
            return 0;
    }
    return 1;
}

答案 2 :(得分:1)

正如其他人所提到的,您的代码存在的问题是您没有进行相等性测试,但实际上是包含测试。

但请注意,如果您对重复的元素感到困扰,即使重复与数组交换的比较也会产生错误的结果。例如,尝试使用{1,1,2}{2,2,1}

这是一个快速而又肮脏(但效率很高)的解决方案。

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

//flag = 1 means the two arrays are equal, or empty
//flag = 0 means that the two arrays are not equal

int scrambled(int a[], int b[], int len)
{
    int i;
    int j;
    int flag;


    if (len == 0)
    {
        return 1;
    }

    for(i = 0; i < len; i++)
    {
        flag = 0;

        for(j = i; j < len; j++)  // start with j = i
        {
            if(a[i] == b[j])
            {
                // we got a match, hence forget about b[j]
                b[j] = b[i];

                // one match is enough for the current iteration
                flag = 1;
                break;
            }
        }


        if(flag == 0)
        {
            printf("Number not found\n");
            return flag;
        }

    }

    printf("Here is flag: %d\n", flag);
    return flag;
}

int main()
{
    int array[100] = {1,1,1};
    int array2[100] = {1,2,3} ;

    int len = 3;

    scrambled(array,array2,len);
}

答案 3 :(得分:0)

您的代码实际上在做的是告诉您第一个数组中的每个值是否都可以在第二个数组中找到。 我建议您通过交换所述数组运行该函数2次并比较结果:

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

//flag = 1 means the two arrays are equal, or empty
//flag = 0 means that the two arrays are not equal

int scrambled( int a[], int b[], int len)
{
    int i = 0;
    int j = 0;
    int flag = 0;

    if (len == 0)
    {
        return 1;
    }

    for(i = 0; i < len; i++)
    {
        flag = 0;

        for( j = 0; j < len; j++)
        {
            if( a[i] == b[j])
            {
                flag = 1;
            }
        }

        if (flag == 0)
            return flag;

    }
    return flag;
}

int main()
{
    int array[100] = {1,1,1};
    int array2[100] = {1,2,3} ;

    int len = 3;

    if (scrambled(array,array2,len) && scrambled(array2,array,len))
        printf("Equal\n");
    else
        printf("Not equal\n");
}

Equal的输出为{1,3,2} ; {1,2,3}Not equal的输出为{1,1,1} ; {1,2,3}

答案 4 :(得分:0)

您的代码不正确。您的代码检测到array1的所有元素是否都在数组2中,而不是相反。尝试拨打

scrambled(array2,array,len);

你会看到。

答案 5 :(得分:0)

使用BLUEPIXY和user3435489的想法:

#include <stdbool.h>
#include <string.h>
#include <stdio.h>

bool match_scrambled( int a[], int b[], int len)
{
    if (len == 0) return true;

    int bx[len], nbx = len;
    memcpy(bx, b, sizeof bx);

    for (int i = 0; i < len; ++i)
        for (int j = 0;; ++j)
        {
            if (j == nbx)
                return false;

            if( a[i] == bx[j])
            {
                bx[j] = bx[--nbx];
                break;
            }
        }

    return true;
}

int main()
{
    int array[] = {1,1,1};
    int array2[] = {1,2,3};

    if (!match_scrambled(array, array2, sizeof array / sizeof *array))
        printf("no ");
    printf("match\n");
    return 0;
}