您的位置:首页 > 其它

在一个整形数组中去掉重复的数字

2014-07-18 10:35 281 查看
请把一个整形数组中重复的数字去掉。例如:

1, 2, 0, 2, -1, 999, 3, 999, 88

答案应该是:

1, 2, 0, -1, 999, 3, 88

------------------------------------------------------------------

思路1:

依次遍历数组,对于一个元素,把这个元素和之前所有的元素比较。如果相同,就把这个元素过滤掉,用后面不重复的元素覆盖。这里采用一个变量k,k表示下一个元素应该放在arr数组中的哪一个位置,如果元素与前边的任何一个元素相同,则k不变这个元素就等着被下一个不重复的元素覆盖,如果不同且把这个元素放在arr数组的k位置,然后k加1,存放下一个不重复的数组。

#include<iostream.h>

void main()
{
int arr[]={1,2,0,2,-1,999,3,999,88},k=1;  //k是数放在arr中的位置

for(int i=1;i<sizeof(arr)/sizeof(int);i++)
{
bool f=true;
for(int j=0;j<i;j++)
if(arr[i]==arr[j])
f=false;
if(f)
arr[k++]=arr[i];
}

for(i=0;i<k;i++)
cout<<arr[i]<<"  ";
cout<<endl;
}
---------------------------------------------------------------------------------------------------------------------

思路2:利用hash表(这里的hash是个数据结构,里面存放正数和负数)的思想,先求出数组中的最大值,然后可以确定hash表的大小,然后就可以遍历arr数组,根据这个数的大小,放到hash[abs(arr[i])]中的相应位置,里面的标记置为1,下次再碰到直接next。

#include<iostream.h>
#include<malloc.h>
#include<math.h>

struct hashtable
{
int num;
int negative;
};

int findmax(int arr[],int len)
{
int max=-999999;
for(int i=0;i<len;i++)
if(abs(arr[i])>max)
max=arr[i];
return max;
}

void main()
{
int arr[]={1,2,0,2,-1,999,-2,3,-2,-1,999,88},max=0;

max=findmax(arr,sizeof(arr)/sizeof(int));

hashtable *hash=(hashtable *)malloc((max+1)*sizeof(hashtable));

for(int i=0;i<=max;++i)  //初始化hash表
{
hash[i].num=0;
hash[i].negative=0;
}

int k=0;  //k是数放在arr中的位置,遇到重复的数k不变
for(i=0;i<sizeof(arr)/sizeof(int);++i)
{
if(arr[i]>=0&&hash[arr[i]].num==0)
{
hash[arr[i]].num=1;
arr[k++]=arr[i];
}
else if(arr[i]<0&&hash[abs(arr[i])].negative==0)
{
hash[abs(arr[i])].negative=1;
arr[k++]=arr[i];
}
}

for(i=0;i<k;++i)
cout<<arr[i]<<"  ";
cout<<endl;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐