0
点赞
收藏
分享

微信扫一扫

166 请把一个整形数组中重复的数字去掉


66、微软面试题
请把一个整形数组中重复的数字去掉。例如: 
1,    2,    0,    2,    -1,    999,    3,    999,    88 
答案应该是:

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


/*
66、微软面试题
yaoha2003
请把一个整形数组中重复的数字去掉。例如:
1, 2, 0, 2, -1, 999, 3, 999, 88
答案应该是:
1, 2, 0, -1, 999, 3, 88

为了节省时间,用hash表存储标记,但是不知道其大小,
所以先遍历一遍,绝对值最大的数,确定大小;
然后,有正负情况,用结构体表示 ,正数,负数的存在情况
第二次遍历数组,已出现过步放入数组,用一个指针从头开始标记。
*/
#include<iostream>
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
using namespace std;
struct hashTable{
int pos,neg;
hashTable()
{
pos=0;
neg=0;
}
};
int main()
{
int a[] = {1,2,0,2,-1,999,3,999,88,1,2,2,2,-1,4,4,55,444,55,444,4444};
int len,i,max,t,k;

//输出原数组
len=sizeof(a)/sizeof(int);
for(i=0;i<len;i++)
printf("%d ",a[i]);
printf("\n");

//第一遍遍历 确定hash大小
max=-1;
for(i=0;i<len;i++)
{
t=abs(a[i]);
if(t>max)
max=t;
}
hashTable *hash=new hashTable[max+1];

k=0;//更新后的数组指针
for(i=0;i<len;i++)
{
if(a[i]>=0&&hash[a[i]].pos==1||a[i]<0&&hash[-a[i]].neg==1)//出现过
continue;
if(a[i]>=0)//标记存在
hash[a[i]].pos=1;
else
hash[-a[i]].neg=1;
a[k++]=a[i];
}

for(i=0;i<k;i++)//输出原数组
printf("%d ",a[i]);
printf("\n");

return 0;
}

举报

相关推荐

0 条评论