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



我有一些我想修改的C代码。

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

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

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

3, 7, 13

这是我的尝试还不够的:

#include <stdio.h>
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个元素)。这不是订购的,我不应该修改它们。它们中每个元素都是唯一的,每个数字只能出现1次。V2仅包含V1中元素的子集。实现这一目标的最有效方法是什么?

一种在记忆方面贪婪的方法,但在CPU周期(线性时间)方面很快是直方图,因为在琐事中的列表比较通常使用二次执行复杂性:(

代码列表


#include <errno.h>
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <time.h>
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操作的双for()循环。

#include <assert.h>
#include <stdio.h>
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

您可以通过元素进行任何数组和对其进行迭代的迭代开始,并查找该元素是否在第二个数组中,也通过嵌套以进行循环,并在内部循环中放置IF条件将公共元素存储在另一个数组中,然后将两个数组与一个数组进行比较,并将不常见的元素放在另一个数组中。

喜欢:

int a[min(l1,l2)], b[l], x = 0, k = 0, flag = 1;
for(int i=0; i<l1; i++){
for(int j=0; j<l2; j++){
    if(v1[i]==v2[j]){
        a[k] = v1[i];
        k++;
    }
}
}
for(int i=0; i<l1; i++){
flag = 1;
for(int j=0; j<k; j++){
    if(v1[i] == a[j]){
      flag = 0;
      break;
    }
}
if(flag==1){
    b[x] = v1[i];
    x++;
}
}
for(int i=0; i<l2; i++){
flag = 1;
for(int j=0; j<k; j++){
    if(v2[i] == a[j]){
      flag = 0;
      break;
    }
}
if(flag==1){
    b[x] = v2[i];
    x++;
}
}

之后您可以打印数组。

#include<stdio.h>
#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<MAX_OLD)
      temp[z++]=old[j++];
   printf("Temp[0] : %d  %d %d %d %d %d %d %dn",temp[0],temp[1],temp[2],temp[3],temp[4],temp[5],temp[6],temp[7]);
   return 0;
}

最新更新