我编写了一个删除重复值的代码,并在那里添加0。 但我觉得我的代码应该比这更好,如果有人能更好地开发这个代码。 请建议我并建议我。
这是我的代码:
#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;
}
答案 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;
}