去除数组中的重复数字

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

××××××××××××××××××××××××××××××××××

申请标志数组

此题重复的数字可能不只一个,上述求和的方法不行了。因为是高效率,我们可以采用空间换时间的策略来解决。

设立访问标志数字,初始化为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;

}

××××××××××××××××××××××××××××××××××

符号标志法

上述方法的空间复杂度为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++面试之算法系列--去除数组中的重复数字的更多相关文章

  1. lintcode100 删除排序数组中的重复数字

    删除排序数组中的重复数字   给定一个排序数组,在原数组中删除重复出现的数字,使得每个元素只出现一次,并且返回新的数组的长度. 不要使用额外的数组空间,必须在原地没有额外空间的条件下完成. 您在真实的 ...

  2. lintcode :Remove Duplicates from Sorted Array II 删除排序数组中的重复数字 II

    题目: 删除排序数组中的重复数字 II 跟进“删除重复数字”: 如果可以允许出现两次重复将如何处理? 样例 给出数组A =[1,1,1,2,2,3],你的函数应该返回长度5,此时A=[1,1,2,2, ...

  3. lintcode :Remove Duplicates from Sorted Array 删除排序数组中的重复数字

    题目: 删除排序数组中的重复数字 给定一个排序数组,在原数组中删除重复出现的数字,使得每个元素只出现一次,并且返回新的数组的长度. 不要使用额外的数组空间,必须在原地没有额外空间的条件下完成.  样例 ...

  4. lintcode101 删除排序数组中的重复数字 II

    删除排序数组中的重复数字 II   跟进“删除重复数字”: 如果可以允许出现两次重复将如何处理? 在:lintcode100删除排序数组中的重复数字 的基础上进行改进. class Solution ...

  5. lintcode-101-删除排序数组中的重复数字 II

    101-删除排序数组中的重复数字 II 跟进"删除重复数字": 如果可以允许出现两次重复将如何处理? 样例 标签 数组 两根指针 脸书 思路 参照上一篇博客lintcode-100 ...

  6. lintcode-100-删除排序数组中的重复数字

    100-删除排序数组中的重复数字 素只出现一次,并且返回新的数组的长度. 不要使用额外的数组空间,必须在原地没有额外空间的条件下完成. 样例 给出数组A =[1,1,2],你的函数应该返回长度2,此时 ...

  7. [剑指offer]3.数组中的重复数字

    3.数组中的重复数字 题目 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了 ...

  8. JavaScript去除数组中的重复值

    用原型函数(prototype)可以定义一些很方便的自定义函数,实现各种自定义功能. Javascript 中的原型函数(prototype)的工作原理,在 javascript 中每次声明新函数的过 ...

  9. 删除排序数组中的重复数字 II

    题目连接 http://www.lintcode.com/zh-cn/problem/remove-duplicates-from-sorted-array-ii/ 题目大意 跟进“删除重复数字”: ...

随机推荐

  1. Xcode各版本官方下载

    官方下载, 用开发者账户登录,建议用Safari浏览器下载. 官方下载地址: https://developer.apple.com/xcode/downloads/ Xcode 66.4: http ...

  2. iOS搜索框UISearchBar 分类: ios技术 2015-04-03 08:55 82人阅读 评论(0) 收藏

    当你在seachBar中输入字母之前的时候,只是用鼠标选中searchBar的时候,如图 终端输出截图如下:(这个时候调用先shouldBeginEditing,之后调用didBeginEditing ...

  3. js实现的文章输入检查与测速。(纯js版本)

    朋友又提出一些需求.希望不要jquery .于是修改成js版本. <!DOCTYPE html> <html> <head> <meta charset=&q ...

  4. APK的反编译

    有秘密的地方就有见不得光的东西,我讨厌这些,所以对于某一个XX圈APP极其反感,感觉就像一个色情网站 一.ApkTool的使用 看了几个教程,自己下载的好像总是不完整,下载包解压后一个没有aapt.e ...

  5. 在ubuntu中为navicat创建快捷方式

    在ubuntu中,解压navicat并不会生成快捷方式,每次运行都需要进入软件解压的目录,然后运行命令开启navicat,十分不便.今天尝试引入快捷方式,直接双击运行,感觉挺不错. 首先下载一个合适的 ...

  6. Maven deploy时报Fatal error compiling: tools.jar not found错误的问题处理

    摘自:http://blog.csdn.net/achilles12345/article/details/19046061 在Eclipse环境下,使用Maven进行deploy时发现报了该错误:F ...

  7. Bagging和Boosting 概念及区别

    Bagging和Boosting都是将已有的分类或回归算法通过一定方式组合起来,形成一个性能更加强大的分类器,更准确的说这是一种分类算法的组装方法.即将弱分类器组装成强分类器的方法. 首先介绍Boot ...

  8. 如何设置打开jsp页面速度加快?

    1.

  9. XML 特殊字符处理和 CDATA

    在处理XML数据时,特殊字符要特殊处理,不能和节点字符混淆. 所有 XML 文档中的文本均会被解析器解析. 只有 CDATA 区段(CDATA section)中的文本会被解析器忽略. PCDATA ...

  10. Java Des加解密方法(c#加密Java解密)

    最近我们用Java把一个用.net编写的老系统重新做了翻版,但是登录还是用.net的登录.这样就会遇到一个比较棘手的问题,我们登录用的cookie信息都是.net用des加密的,但我们不得不用Java ...