C:仅打印2个数组中不常见的元素

我有一些我想要修改的C代码非常简单。

假设我有两个像这样的数组

int v1[5] = {1, 3, 7, 13, 10}; int v2[2] = {1, 10}; 

我想打印不常见的元素(差异),如:

 3, 7, 13 

这是我的尝试还不够:

 #include  int main() { int v1[5] = { 1, 3, 7, 13, 10 }; int v2[2] = { 1, 10 }; for (int i = 0; i < sizeof(v1) / (sizeof * v1); i++) { for (int j = 0; j < sizeof(v2) / (sizeof * v2); j++) { if (v1[i] != v2[j]) { printf("%d ", v1[i]); break; } else { break; } } } return 0; } 

这两个数组总是很短(最多6个元素)。 Thery没有订购,我不应该修改它们。 每个元素中的元素都是唯一的,即每个数字只能在每个数组中出现1次。 v2只包含v1中元素的子集。 实现这一目标的最有效方法是什么?

您可以从任意数组开始,逐个元素地迭代它,并通过嵌套的for循环查找该元素是否在第二个数组中,并在内部for循环中放置if条件并将公共元素存储在另一个数组中然后比较两个数组数组与该数组一个接一个,并将不常见的元素放在另一个数组中。

喜欢:

 int a[min(l1,l2)], b[l], x = 0, k = 0, flag = 1; for(int i=0; i 

之后您可以打印arrays。

一种在内存方面贪婪但在CPU周期(线性时间)方面快速的方法是直方图,因为平凡意义上的列表比较通常使用二次执行复杂度:(

代码清单


 #include  #include  #include  #include  #include  int main(void) { /* Allocate. */ int numElements1 = 0; int numElements2 = 0; const int maxHistVal = UINT8_MAX + 1; const int maxElements = 10; const int minElements = 1; uint8_t *arr1 = NULL, *arr2 = NULL; uint8_t *histogram = NULL; /* Init random seed. */ srand(time(NULL)); /* Determine number of elements for each array. */ numElements1 = (rand() % (maxElements - minElements)) + minElements; numElements2 = (rand() % (maxElements - minElements)) + minElements; /* Generate two random arrays with non-duplicated values. */ if (NULL == (arr1 = calloc(numElements1, sizeof(uint8_t)))) { return ENOMEM; } else if (NULL == (arr2 = calloc(numElements2, sizeof(uint8_t)))) { free(arr1); return ENOMEM; } else if (NULL == (histogram = calloc(maxHistVal, sizeof(uint8_t)))) { free(arr2); free(arr1); return ENOMEM; } else { /* Have our sample arrays and histogram. Populate them and print them * out. */ printf("ARR1: "); uint8_t j = 0; for (int i = 0, j = 0; i < numElements1; i++) { /* Populate array. */ j += (rand() % 2) + 1; arr1[i] = j; printf("%-3d ", arr1[i]); /* Update histogram. */ histogram[arr1[i]]++; } printf("\n"); printf("ARR2: "); for (int i = 0, j = 0; i < numElements2; i++) { /* Populate array. */ j += (rand() % 2) + 1; arr2[i] = j; printf("%-3d ", arr2[i]); /* Update histogram. */ histogram[arr2[i]]++; } printf("\n"); /* Print out only values that appear exactly once in the histogram. */ printf("HISTOGRAM: UNIQUE VALUES: "); for (int i = 0, j = 0; i < maxHistVal; i++) { /* Print histogram. */ if (1 == histogram[i]) { printf("%-3d ", i); } } printf("\n"); /* For fun, identify the duplicates. */ printf("HISTOGRAM: DUPLICATE VALUES: "); for (int i = 0, j = 0; i < maxHistVal; i++) { /* Print histogram. */ if (1 < histogram[i]) { printf("%-3d ", i); } } } /* Cleanup..*/ free(histogram); free(arr2); free(arr1); return 0; } 

样品运行


 ARR1: 2 3 4 6 8 9 10 ARR2: 1 2 3 4 HISTOGRAM: UNIQUE VALUES: 1 6 8 9 10 HISTOGRAM: DUPLICATE VALUES: 2 3 4 

实现这一目标的最有效方法是什么?

如果a[], b[]的值范围限制为0到63,则代码可以使用unsigned long long掩码。

这通过每个数组l1 + l2操作迭代一次,而不是使用l1 * l2操作的double for()循环。

 #include  #include  int main(void) { const int v1[5] = { 1, 3, 7, 13, 10 }; const int v2[2] = { 1, 10 }; unsigned long long mask = 0; for (size_t i = 0; i < sizeof(v2) / (sizeof *v2); i++) { assert(v2[i] >= 0 && v2[i] < 64); mask |= 1ull << v2[i]; } mask = ~mask; for (size_t i = 0; i < sizeof(v1) / (sizeof *v1); i++) { assert(v1[i] >= 0 && v2[i] < 64); if ((1ull << v1[i]) & mask) { printf(" %d", v1[i]); } } puts(""); return 0; } 

产量

  3 7 13 
 #include #define MAX_OLD 4 #define MAX_NEW 2 int main() { int old[] = {3, 4, 5, 6}; int new[] = {4, 5}; int temp[] = {0, 0, 0, 0, 0, 0, 0, 0}; int j = 0,z=0,i=0; for(i = 0; i < MAX_NEW; i++) { for(; j < MAX_OLD; j++) { if(old[j] <= new[i]) { if(old[j]!=new[i]) temp[z++] = old[j]; } else { break; } } } while(j 
Interesting Posts