删除重复值并在其位置添加0

时间:2015-05-31 19:53:23

标签: c arrays loops

我编写了一个删除重复值的代码,并在那里添加0。 但我觉得我的代码应该比这更好,如果有人能更好地开发这个代码。 请建议我并建议我。

  • 输入 - 2,3,4,3,6
  • 输出 - 2,3,4,0,6

这是我的代码:

#include<stdio.h>
int main()
{
   int a[100],b[100];
   int i,j,size;
   scanf("%d",&size);
   for(i=0;i<size;i++)
   {
      scanf("%d",&a[i]);
   }

   for(i=0;i<size;i++)
   {
      b[i]=a[i];

   }

   for(i=0;i<size;i++)
   {
      for(j=i+1;j<size;j++)
      {
         if(a[i]==a[j])
         {
            b[j]=0;
         }
      }
   }

   for(i=0;i<size;i++)
      printf("%d\n",b[i]);

   return 0;
}

4 个答案:

答案 0 :(得分:1)

清除重复项,因为它们输入如下,与目前输入的值进行比较:

#include<stdio.h>
int main() {
  int a[100];
  int i,j,size;
  scanf("%d",&size);
  for(i=0;i<size;i++)
    {
      scanf("%d",&a[i]);
      for(j=0;j<i;j++){
        if(a[j]==a[i]) {
          a[i]=0; /* found duplicate among previous entries! */
          break;
        }
      }
    }
  for(i=0;i<size;i++)
    printf("%d\n",a[i]);
  return 0;
}

答案 1 :(得分:0)

这里有一个改进,但我同意它感觉它可以明显更好(也许我稍后会再回到这里......):

#include<stdio.h>
int main()
{
   int a[100];
   int i,j,size,left;
   scanf("%d",&size);
   for(i=0;i<size;i++)
   {
      scanf("%d",&a[i]);
   }

   left = size;
   for(i=0;i<size&&left>1;i++) // If there's only 1 left, it's not a duplicate
   {
      if(a[i] == 0) // No need to test these, already done
         continue;

      for(j=i+1,left=0;j<size;j++)
      {
         if(a[i]==a[j])
         {
            a[j]=0;
         }
         if(a[j]!=0)
            left++; // If we don't get here, there's nothing left to test
      }
   }

   for(i=0;i<size;i++)
      printf("%d\n",a[i]);

   return 0;
}

所以基本上,不要在当前位置之前搜索0,并且在搜索其他任何内容时(实际标记)是否还有剩余要测试。

答案 2 :(得分:0)

以下是我的一些想法:

解决方案1:

使用位指示是否发生了数字。 例如在32位机器上,1 int有32位,如果你的数字范围是1~1000,那么你需要32 int,当你遇到一个更大的数字时你可以通过realloc()更改它。

如果您的号码范围很小,那么它非常合适。

解决方案2:

将已排序的数字存储在二叉树中,以便您可以更快地搜索。

答案 3 :(得分:0)

您可以使用单个数组本身,并在其中找到重复的位置标记。这样的事情。

#include<stdio.h>

int main() {
    int a[100];
    int i,j,size;
    scanf("%d",&size);
    for(i=0;i<size;i++) {
        scanf("%d",&a[i]);
    }

    for(i=1; i<size; i++) {
        for(j=i-1; j>=0; j--) {
            if(a[i]==a[j]) {
                a[i]=0;
                break;
            }      
        }
    }

    for(i=0;i<size;i++)
        printf("%d ",a[i]);

    return 0;
 }