【问题标题】:Function that cleans up duplicates in array清除数组中重复项的函数
【发布时间】:2017-10-04 03:33:28
【问题描述】:

我正在尝试创建一个函数来清除数组中的数字重复项,但似乎我无法弄清楚我缺少什么来删除重复项。 只是为了更清楚: 该函数不应变为无效。

[1,2,3,3,4] -> [1,2,3,4]
[4,2,5,1]->[4,2,5,1]
[32,21,2,5,2,1,21,4]->[32,21,2,5,1,4]

我的数组中不应该是空格,函数应该返回 已清理数组中的唯一元素,其中已清理被定义为“整数不重复”

#include <stdio.h>

int generateUniqeList(int *list, int length);

int main()
{
    int list[6] = { 5, 5, 4, 3, 2, 1 };
    int duplicate = generateUniqeList(list, 6);

    for (int i = 0; i < 6; i++)
    {
        printf("%d\n", list[i] - 1); //Here i am able to change the value of the duplicates with the - 1
    }
    getchar();

    return 0;
}


int generateUniqeList(int *list, int length)
{
    int duplicate = 0;

        for (int i = 0; i < length; i++)
        {
            if (list[i] == list[i])
                duplicate = list[i];
        }
    return duplicate;
}

【问题讨论】:

  • 对于i 的某些值,您是否期望此条件if (list[i] == list[i]) 评估为false
  • @jhhoff02 这不是客观的 c
  • 元素值有上限吗?
  • 要删除一个 int,您必须将整个数组从要删除的当前位置向左移动一个索引。
  • @Module 假设您不想就地执行此操作。我会生成一个新列表。

标签: c arrays function duplicates


【解决方案1】:
#include <stdio.h>
#include<string.h>


void generateUniqeList(int *list, int length);

int main()
{
  int list[6] = { 5, 5, 4, 3, 2, 1 };
  generateUniqeList(list, 6);

  for (int i = 0; i < 6; i++)
  {
    printf("%d", list[i]); 
  //Here i am able to change the value of the duplicates with the - 1
  }
  putchar('\n');

  return 0;
}


void generateUniqeList(int *list, int length){
  int i ,j,k;
  for (i = 0; i < length; i++) {
      for (j = i + 1; j < length;) {
         if (list[j] == list[i]) {
            for (k = j; k < length; k++) {
               list[k] = list[k + 1];
            }
            length--;
         } else
            j++;
      }
   }

}

【讨论】:

    【解决方案2】:

    您正在做的是将列表中的每个 int 减去 1。这不会删除重复项。要从数组中删除元素,请查看: How to remove an element from an array in C?

    【讨论】:

      【解决方案3】:

      这个函数没有意义。例如这个 if 语句中的条件

      if (list[i] == list[i])
          duplicate = list[i];
      

      总是正确的,因为每个对象都等于它自己。

      并且函数不会修改数组。

      您无法调整数组的大小,但可以收集数组开头的所有唯一元素并返回唯一元素的数量。

      这是一个演示程序。

      #include <stdio.h>
      
      size_t generateUniqeList( int *a, size_t n )
      {
          size_t m = 0;
      
          for ( size_t i = 0; i < n; i++ )
          {
              size_t j = 0;
              while ( j < m && a[j] != a[i] ) j++;
      
              if ( j == m )
              {
                  if ( m != i ) a[m] = a[i];
                  ++m;
              }
          }
      
          return m;
      }   
      
      int main(void) 
      {
          int list[] = { 5, 5, 4, 3, 2, 1 };
          const size_t N = sizeof( list ) / sizeof( *list );
      
          for ( size_t i = 0; i < N; i++ ) printf( "%d ", list[i] );
          putchar( '\n' );
      
          size_t m = generateUniqeList( list, N );
      
          for ( size_t i = 0; i < m; i++ ) printf( "%d ", list[i] );
          putchar( '\n' );
      
          return 0;
      }
      

      它的输出是

      5 5 4 3 2 1 
      5 4 3 2 1 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-06-23
        • 2015-12-01
        • 2013-12-28
        • 2014-12-03
        • 2019-07-11
        • 2019-04-08
        相关资源
        最近更新 更多