首页 > 解决方案 > 如何编写一个函数来返回没有匹配对的数组元素的值?

问题描述

我想就必须返回没有匹配对的数组元素的值的函数寻求帮助。

例如,

a) 在数组 [1, 1, 2, 3, 4, 3, 4] 中,没有对的元素是 2。

b) 在数组 [1, 1, 2, 4, 3, 4, 2, 3, 4] 中,没有对的元素是 4。

到目前为止,我想出了下面的代码。所以基本上它检查重复的数字,因此适用于 b) 情况;但它不适用于 a) 案例。欢迎任何有关如何修复此代码以使其适用于 a) 和 b) 情况的帮助。

#include <stdio.h>

    int     ft_unmatch(int *tab, int length)
    {
      int i;
      int j;
      int count;

      i = 0;
      while (i < length)
        {
          j = i + 1;
          count = 0;
          if (tab[i] == tab[j])
            {
              count++;
              while (j < length)
                 {
                  if (tab[i] == tab[j])
                    count++;
                 j++;
                 }
          if (count % 2 != 0)
              return (tab[i]);
           }
          i++;
        }
      return (tab[i]);
    }


    int     main(void)
    {
      //some additional arrays to check the function
      int tab[9] = {1, 1, 2, 4, 3, 4, 2, 3, 4};
      //int tab[11] = {1, 1, 2, 4, 3, 1, 4, 2, 4, 3, 4};
      // int tab[7] = {1, 1, 2, 3, 4, 3, 4};
      printf("%d\n", ft_unmatch(tab, 9));
      return (0);
    }

标签: arraysmatch

解决方案


这段代码有很多问题:

您将每个数字与以下所有数字进行比较。因此,在 a) 中,您将第一个 1 与所有其他数字进行比较并计算两个 1,但随后您再次计算第二个 1 并且找不到另一个,因此您的代码返回 1。

此外,您在 the 之后缺少大括号,并且只有在第一个为真if tab[i] == tab[j])时才能进入while(j<length)-loop 。if(tab[i] == tab[j]

一种可能的解决方案是从数组中删除已经计数的数字,这样您就不会再次计算它们,或者对数组进行排序并计数直到每次递增。如果您只使用小数字,您还可以迭代每个可能的数字并计算它出现的频率,尽管这样会不太优雅。


推荐阅读