比较C中的两个数组,忽略每个数组中元素的顺序



我想比较C中的两个数组,忽略每个数组中元素的顺序,我有两个想法来解决这个问题。老实说,他们是一样的。第一个想法是制作一个变量,如果我们在第二个表中找到元素,则用1递增(请参阅下面的代码(。但如果我们以{3, 2, 2, 1} {1, 2, 3, 4}为例,这个就不起作用了。第二个想法(我显然不会编码(是:例如,在第一个循环之后设置一个变量c=0

for (i = 0; i < n; i++) {
c = 0;
for (...
}

c将计算失败的次数

if (T1[i] != T2[j]) {
c += 1
}

然后在退出j循环之前,我们检查c==n,其中n是表的长度。这意味着我们有n个失败。之后,在i循环开始时取消设置c

这是我的代码:

#include <stdio.h>
int main() {
int n, i, j, c = 0;
printf("give the size of the first array: n");
scanf("%d", &n);
int T1[n];
int T2[n];
// remplissage de T1
for (i = 0; i < n; i++) {
printf("give the value of %d case, table1: ", i + 1);
scanf("%d", &T1[i]);
}
// remplissage de T2
for (i = 0; i < n; i++) {
printf("give the value of %d case, table2: ", i + 1);
scanf("%d", &T2[i]);
}
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
if (T1[i] == T2[j]) {
c += 1;
break;
}
}
}
if (c == n) {
printf("True");
} else {
printf("False");
}
}

我想我已经找到你想要的了。您需要对进行两次加倍,以检查两种方式的相等性,然后比较这两个数字。

int c = 0;
for(int i = 0; i < 4; i++){
for(int y = 0; y < 4; y++){
if(A1[i] == A2[y]){
c += 1;
break;
}
}
}

int d = 0;
for(int i = 0; i < 4; i++){
for(int y = 0; y < 4; y++){
if(A2[i] == A1[y]){
d += 1;
break;
}
}
}

if(c != n || d != n || c != d){
printf("False");
}else{
printf("true");
}

如果cd不相同,则意味着存在一个以一种方式触发2倍相等的重复。如果cd相同但不等于数组大小,则表示没有重复项,但并非一个数组的所有元素都在另一个数组中。

我希望我一直在帮助

使用这种方法

for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
if (T1[i] == T2[j]) {
c += 1;
break;
}
}
}

则两个阵列CCD_ 8和CCD_。

另外,在if语句中交换数组的两对嵌套for循环的方法也没有帮助。在这种情况下,例如这些阵列CCD_ 10和CCD_。

如果允许对数组进行排序,那么应该对这两个数组进行排序并进行比较。

否则,您可以使用下面演示程序中显示的方法。

#include <stdio.h>
int main( void )
{
enum { n = 5 };
int a1[n] = { 1, 2, 3, 2, 1 };
int a2[n] = { 3, 2, 2, 1, 1 };
int equal = 1;
for (size_t i = 0; equal && i < n; i++)
{
size_t count = 1;
for (size_t j = 0; j != i; j++)
{
if (a1[i] == a1[j]) ++count;
}
for (size_t j = 0; count && j < n; j++)
{
if (a2[j] == a1[i]) --count;
}
equal = count == 0;
}
printf( "The arrays are %sequal.n", equal ? "" : "not " );
}

程序输出为

The arrays are equal.

如果第一个数组中存在重复,则方法失败:{ 0, 0 }将与{ 0, 1 }进行比较。如果将T1T2进行双向比较,则仍然会有以下反例:{ 0, 0, 1 }{ 0, 1, 1 }

你可以通过计算其中一个数组中每个元素在两个数组中的出现次数来解决这个问题:如果所有计数都匹配,则数组包含相同的数字:

#include <stdio.h>
int count(int val, const int *T, int n) {
int c = 0;
for (int i = 0; i < n; i++)
c += (T[i] == val);
return c;
}
int main() {
int n, i;
printf("give the size of the first array: n");
if (scanf("%d", &n) != 1)
return 1;
int T1[n];
int T2[n];
// remplissage de T1
for (i = 0; i < n; i++) {
printf("give the value of %d case, table1: ", i + 1);
if (scanf("%d", &T1[i]) != 1)
return 1;
}
// remplissage de T2
for (i = 0; i < n; i++) {
printf("give the value of %d case, table2: ", i + 1);
if (scanf("%d", &T2[i]) != 1)
return 1;
}
for (i = 0; i < n; i++) {
if (count(T1[i], T1, n) != count(T1[i], T2, n))
break;
}
if (i == n) {
printf("Truen");
} else {
printf("Falsen");
}
return 0;
}

由于嵌套循环,上述代码的时间复杂度为O(n2(。通过对两个数组进行排序并按顺序进行比较(复杂性O(n.log(n(((,您可以为大型n获得更好的性能

相关内容

  • 没有找到相关文章

最新更新