简单算法:去掉1维数组中的重复项

carlosadps 2005-01-19 03:43:59
比如我把 1,2,4,4,6,5,8等数据放入1维数组中,在该数组中去掉重复的项
处理后变成 1,2,4,6,5,8
那位大哥给一个较好的算法好吗?
各位兄弟就直接写点代码,我比较愚,光说是听不懂的。
...全文
1219 36 打赏 收藏 转发到动态 举报
写回复
用AI写文章
36 条回复
切换为时间正序
请发表友善的回复…
发表回复
zrpxd 2005-01-23
  • 打赏
  • 举报
回复
还有一种最简单最好理解的方法:
#include<stdio.h>
#include<string.h>
main()
{
int i,j,k;
char str[20];
int len;
gets(str);
len=strlen(str);
for(i=0;i<len;i++)
{
for(k=j=i+1;j<len;j++)
{
if(str[j]!=str[i])
{
str[k]=str[j];
k++;
}

}
str[k]='\0';
}
}
ybt631 2005-01-23
  • 打赏
  • 举报
回复
二叉排序树不错
zyp2kyear 2005-01-23
  • 打赏
  • 举报
回复
先找最大数8,建立一个数组bool a[8+1],全部初始化为false,

1,2,4,4,6,5,8

a[0] = false;
a[1] = true; //1
a[2] = true; //2
a[3] = false; //
a[4] = true; //4
a[4] = true; //4
a[5] = false;
a[6] = true; //6
a[7] = false;
a[8] = true; //8

输出数组中为真的序号就行了
macrod 2005-01-22
  • 打赏
  • 举报
回复
从头读数,向后找,找到一样的,设置为不可能值。
lbaby 2005-01-22
  • 打赏
  • 举报
回复
用二叉树是比较简单的,由于c++中的set是不重复的二叉树
所以,用set来写,是相当简单的:


#include <iostream>
#include <set>

int main(void)
{
int ar[] = {1,1,2,2,3,3,4,4,5,5};
std::set<int> ist(ar,ar+sizeof(ar)/sizeof(ar[0]));
std::set<int>::const_iterator itor;
for( itor = ist.begin();
itor != ist.end();
++itor)
{ std::cout<<*itor<<'\n';}
}



1
2
3
4
5



lbaby 2005-01-22
  • 打赏
  • 举报
回复
用c++可以么?
tigergt 2005-01-22
  • 打赏
  • 举报
回复
int a[7] = {1,2,4,4,6,5,8}, Tail = 0;
BOOL bFind;
for(int i = 1; i < 7; i++)
{
bFind = false;
for(int j = 0; j <= Tail; j++)
{
if(a[i] == a[j])
{
bFind = true;
break;
}
}
if(!bFind)
{
a[Tail++] = a[i];
}
else
{
for(int j = Tail+1; j < 7; j++)
{
a[j] = a[j+1];
}
a[6] = -1;
}
}
后面缺损的为-1
murphy008 2005-01-20
  • 打赏
  • 举报
回复
顶一下!效率最高的办法就是 指针+排序(建议插值法),代码最简单的楼上已经有了!我正在安装VC,不好意思,不能立即给出代码!呵呵!
TomDebug 2005-01-20
  • 打赏
  • 举报
回复
方法1:动态二叉树
方法2:(matlab)中的
any(diff(sort(a)))
效率绝对高
顶matlab
zhousqy 2005-01-20
  • 打赏
  • 举报
回复
再次BS以下偶自己。。。是二叉排序树。。。
--------------------------------------
不错。
--------------------------------------
读数组、插入一棵二叉排序树中、在遍历二叉排序树存到数组中。
zhousqy 2005-01-20
  • 打赏
  • 举报
回复
再次BS以下偶自己。。。是二叉排序树。。。
--------------------------------------
不错。
idler 2005-01-20
  • 打赏
  • 举报
回复
那个是set_union函数。
zhliangle 2005-01-20
  • 打赏
  • 举报
回复
如果用C++編的話可以直接用一個泛算法函數就解決了.不過這個函數我不記得了.哈哈.但是我保證是有的.
macrod 2005-01-20
  • 打赏
  • 举报
回复
个人认为宁无悔program 最初的想法加上 lxd2 的使用链表节省空间的实现就可以了,没必要那么复杂。
lxd2 2005-01-20
  • 打赏
  • 举报
回复
楼主的意思是要保持原来的次序,所以先排序估计行不通!
我用了简单的比较方式,先定义一个链表,把不重复的数依次插在链表的末尾,链表是动态的
故没有浪费内存资源,该程序在vc6.0下通过
#include "stdafx.h"

#include "iostream.h"
struct list
{
int data;
list * next;
};

void main()
{
int a[]={1,2,7,3,3,4,5,4,5,6};
list *head=NULL;
list *tail=NULL;
for(int i=0;i<sizeof(a)/4;i++)
{
bool flag=false;
for(list *p=head;p;p=p->next)
{
if(p->data==a[i])
{
flag=true;
break;
}
}

if(!flag)
{
list *temp=new list;
if(head==NULL)
{
temp->data=a[i];
temp->next=NULL;
head=temp;
tail=temp;

}
else
{
temp->data=a[i];
temp->next=NULL;
tail->next=temp;
tail=temp;

}

}
}
for(list *q=head;q;q=q->next)
cout<<q->data;
}
xue23 2005-01-20
  • 打赏
  • 举报
回复
用冒泡法。把重复的数据去掉。
a[k];
b[k];
int m = 0;
for(int i= 0; i < k-1 ; i++)
{
bool flag = false;
for(int j =i+1; j< k; j ++)
{
if(a[i] == a[j])
{ flag = true; break;}
}
if(flag == false)
b[m++] = a[i];
}
xue23 2005-01-20
  • 打赏
  • 举报
回复
用起泡法。把重新的数据去掉
lovezn0424 2005-01-20
  • 打赏
  • 举报
回复
我觉得楼主的意思可能是要保持原来的次序,所以先排序估计行不通吧!

所以我觉得还是开辟一个新空间,再往里塞东西就可以了。如果有了就不塞……

不过觉得总体上效率不是很高,而且浪费空间。不过实现比较简单……

楼主看着帮吧……
yinyl 2005-01-20
  • 打赏
  • 举报
回复
用关联数组怎么样?
idler 2005-01-20
  • 打赏
  • 举报
回复
插值排序法都可以用,效率直接插入太低,不如二叉排序树。
加载更多回复(15)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧