C/C++面试之算法系列--去除数组中的重复数字
2008-10-12 03:07
701 查看
去除数组中的重复数字
Sailor_forever sailing_9806@163.com 转载请注明
http://blog.csdn.net/sailor_8318/archive/2008/10/12/3060259.aspx
××××××××××××××××××××××××××××××××××
题目: 有一个数组t[100],存放了1~99之间的数字,用效率较高的代码把重复数字去掉。例如数组{1,2,2,2,3,5,6,6}变成{1,2,3,5,6}。
××××××××××××××××××××××××××××××××××
申请标志数组[/b][/b]
此题重复的数字可能不只一个,上述求和的方法不行了。因为是高效率,我们可以采用空间换时间的策略来解决。
设立访问标志数字,初始化为0,访问到N时将标志数字的第N个元素置为N
最后遍历该数组,若标志数组中对应值为非0,则顺序存储该数字于原数组中,最后返回去除重复数字后的有效数的个数
int RemoveRep(int array[], int n)
{
int *arrayflag = (int *)malloc(n*sizeof(int));
int left = 0, i = 0;
while(i<n)
arrayflag[i++] = false; //初始化标志数组
for(i=0;i<n;i++)//剔除算法
{
arrayflag[array[i]] = array[i]; //将出现过的数保存到对应的位置
}
for(i=0;i<n;i++) //取出有效数
{
if(arrayflag[i] != false)
array[left++] = arrayflag[i];
}
return left;
}
××××××××××××××××××××××××××××××××××
符号标志法[/b][/b]
上述方法的空间复杂度为O(N),利用符号位作为标志即可不申请O(N)标志数组
int SignedRemoveRep(int array[], int n)
{
int i,left = 0;
for(i=0;i<n;i++)//将出现过的位置置负号标志
{
if(array[i] > 0) //可以直接做下标
{
array[array[i]] = -array[array[i]];
}
else
{
if(array[-array[i]] > 0) //为正时才是第一次置标志
array[-array[i]] = -array[-array[i]];
}
}
for(i=0;i<n;i++)//抽取算法
{
if(array[i] < 0) //根据标志顺序保存出现过的值
array[left++] = i;
}
return left;
}
××××××××××××××××××××××××××××××××××
void main(void)
{
int t[100];
int i,j,left;
for(i=0;i<100;i++) //随机产生100个数字
{
j = rand()%99+1;
t[i] = j;
printf("%d ",t[i]);
if(i%10 == 9)
printf("/n");
}
//left = RemoveRep(t, 100);
left = SignedRemoveRep(t, 100);
for(i=0;i<left;i++)
{
printf("%d ",t[i]);
if(i%10 == 9)
printf("/n");
}
}
相关文章推荐
- C/C++面试之算法系列--去除数组中的重复数字
- C/C++面试之算法系列--整数数组的循环右移
- C/C++面试之算法系列--1~n无序数组时间复杂度为O(n)排序
- 【我解C语言面试题系列】008 去除数组中重复数字问题
- C/C++面试之算法系列--时间复杂度为o(N)查找1至N-1构成的a[N]重复元素
- C/C++面试之算法系列--二维动态数组定义及二维静态数组与**P的区别
- 【我解C语言面试题系列】009 特殊的去除数组中重复数字问题
- 【我解C语言面试题系列】009 特殊的去除数组中重复数字问题
- leetcode:Remove Duplicates from Sorted Array II (允许重复一次,去掉数组多余数字)【面试算法题】
- (去重)去除数组中重复数字的算法
- 算法系列——数组中的重复数字
- leetcode:Remove Duplicates from Sorted Array(去掉数组重复数字,常数空间限制)【面试算法题】
- 【我解C语言面试题系列】008 去除数组中重复数字问题
- C/C++面试之算法系列--不申请变量和空间反转字符串
- C/C++面试之算法系列--怎样快速检测出一个巨大的单链表中是否具备死链及其位置
- C/C++面试之算法系列--N!的尾部连续0的个数
- C/C++面试之算法系列--约瑟夫环:每隔两个循环删除数组元素,求最后删除者的下标问题
- 一个数组中有30个数(随机产生[0,30]),将数组中重复的数字去除,动态创建数组保存剩下的数字
- 一道Javascript面试题,去除数组中的重复数字,大家看看我的做法是否正确
- 一个长度为N的整形数组,数组中每个元素的取值范围是[0,N-1],写一个算法判断数组中是否存在重复的数字