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; }