我正在尝试从两个数组输出不同的元素。所以如果我有一个数组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);
}
答案 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]
。
将此b
与b
中的所有元素进行比较后,您会查看自己的旗帜。并根据您是否在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的所有元素之间没有匹配。