【发布时间】:2020-12-03 06:14:30
【问题描述】:
我想检查两个整数类型数组是否具有相同的数字集。例如,如果数组 1 是 5 1 2 3 3 4 6 1,而数组 2 是 1 2 3 4 5 6,则程序返回 1。如果任一数组中的任何数字不在第二个数组中,则程序返回 0。
我尝试做这样的事情,但我无法让它工作:
#include <stdio.h>
int main()
{
int i, j, a[8]={5, 1, 2, 3, 3, 4, 6, 1}, b[6]={1, 2, 3, 4, 5, 6}, x=0;
for(i=0; i<6; i++)
{
for(j=0; j<8; j++)
{
if(a[j]==b[i])
{
x=1;
continue;
}
else
{
x=0;
break;
}
}
}
return x;
}
编辑: 谢谢Some programmer dude
#include <stdio.h>
void sort(int arr[], int n)
{
int i, j, a;
for (i=0; i<n; i++)
{
for (j=i+1; j<n; j++)
{
if (arr[i]>arr[j])
{
a=arr[i];
arr[i]=arr[j];
arr[j]=a;
}
}
}
}
int main()
{
int i, j, k;
int a[8]={5, 1, 2, 3, 3, 4, 6, 1};
int b[6]={1, 2, 3, 4, 5, 6};
int na=8, nb=6;
for(i=0; i<na; i++) // removing duplicates from a
{
for(j=i+1; j<na; j++)
{
if(a[i]==a[j])
{
for(k=j; k<na; k++)
{
a[k]=a[k+1];
}
na--;
j--;
}
}
}
for(i=0; i<nb; i++) // removing duplicates from b
{
for(j=i+1; j<nb; j++)
{
if(b[i]==b[j])
{
for(k=j; k<nb; k++)
{
b[k]=b[k+1];
}
nb--;
j--;
}
}
}
sort(a, na);
sort(b, nb);
if(na!=nb)
return 0;
for(i=0; i<na; i++)
{
if(a[i]!=b[i])
return 0;
}
return 1;
}
【问题讨论】:
-
在一张纸上逐行运行程序。一旦发现不匹配,您目前正在中断。这是错误的,因为后面的数组中可能会有匹配。因此,您需要在做出决定之前检查
a中的所有值。一旦你发现这样一个不匹配的数字,那么代码需要立即跳出两个循环(return 0会这样做)。 -
尝试创建两个 sets 数组(基本上删除所有重复项),然后首先检查集合的 size 如果大小是不同的是,一个包含不在另一个中的数字。然后对集合进行排序,并将一个集合的每个元素与另一个集合的对应元素进行比较。
-
可能有多少位数字?你能想出一个简单的方法来跟踪,例如,
1是否出现在给定的数组中?现在,如果您为每个可能的数字、每个可能的数组应用该技术会怎样? -
@Someprogrammerdude 为什么要删除重复项并然后排序?这不加起来。