去除数组中的重复数字

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");

}

}

转载于:https://www.cnblogs.com/Zblogs/p/3388869.html

C/C++面试之算法系列--去除数组中的重复数字相关推荐

  1. np.unique( )--去除数组中的重复数字,并进行排序之后输出

    该函数是去除数组中的重复数字,并进行排序之后输出. 要求是 arr 里面是相同的维数. import numpy as npresult1 = np.unique([1, 1, 2, 2, 2, 3, ...

  2. 剑指offer系列-03.数组中的重复数字

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

  3. 去除数组中的重复元素

    在一些场景中需要做到数组去重,下面从两种方法来介绍,一种是比较传统的,es6之前就已经出现的:另外一种是es6中的set()可以去除数组中的重复元素,下面我们列举出详细代码: 第一种方法:(index ...

  4. 题目:查找数组中的重复数字,要求空间复杂度为O(1)(基于Java实现)

    题目:查找数组中的重复数字,要求空间复杂度为O(1)(基于Java实现) 题目: 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字 ...

  5. [剑指offer][JAVA]面试题第[03]题[数组中的重复数字][HashSet]

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

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

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

  7. 树状数组求逆序对_算法系列之-数组中的逆序对

    题目来源 剑指offer 01 题目描述 在数组中如果前一个数字大于后一个数字,则称为这个数字组合组成一个逆序对.输入一个数组,求所有的逆序对的总数. 如 数组 {7,5,6,4} 则它的逆序对是 ( ...

  8. C++ 小功能算法模板:去除数组中重复的数

    如何去除数组中重复的部分 1.不排序,直接去除重复的 #include <iostream> #include <vector> using namespace std; in ...

  9. LeetCode算法 删除有序数组中的重复项 删除有序数组中的重复项|| C++

    目录 题目 删除有序数组中的重复项 参考答案 题目 删除有序数组中的重复项|| 参考答案 题目 删除有序数组中的重复项 给你一个有序数组 nums ,请你原地删除重复出现的元素,使每个元素只出现一次 ...

最新文章

  1. 用 Java 训练深度学习模型,原来这么简单
  2. 基于Yolo-V3对卫星图像进行储油罐容积占用率的研究
  3. 1.2 matlab数值数据的输出格式
  4. 栈应用_将算式转成按运算符优先级分布(代码、分析、汇编)
  5. Thinking with Joins
  6. hdfs java操作_hdfs java操作
  7. [转]RTH试用手记之“额外功能”
  8. 一年Android工作经验,一举拿下百度、网易、美团、小米、快手等Offer面经
  9. matlab灵敏度分析操作,灵敏度分析 使用MATLAB编写.doc
  10. 计算机时钟同步的原理,华为以太网时钟同步原理介绍(二)
  11. 实验一计算机网络基础知识,计算机网络实验基础知识 集线器的使用
  12. Error on rename ofXXXXXX (errno: 152)
  13. 【bzoj3687】简单题
  14. 面试必问问题最佳答案
  15. 如何解决DOSBox 0.74无法运行edit指令
  16. 1.27 Watermelon
  17. 11.1-股票基金历年收益率计算
  18. centos7 解决硬盘内存爆满
  19. 【FPGA】SCCB通信协议
  20. POJ 4151/北大百练 4151 电影节 题解(两种方法)贪心算法基础

热门文章

  1. android系统应用程序,Android调用系统应用程序
  2. 计算机课程可在平板上做吗,老师做直播,孩子上网课,掌控线上学习就靠这个平板电脑了...
  3. 无限级导航PHP,jQuery多级无限级导航下拉菜单代码
  4. 如何让oracle用户不过期,Oracle用户密码设为不过期的两种方法
  5. php get获取腾讯视频vid,获取腾讯视频源地址链接的方法
  6. oracle 历史查询是哪个机器发起的,Oracle 查询历史连接主机信息
  7. STM32F103基本定时器使用
  8. libusb的交叉编译
  9. spring之基本介绍以及老版本框架的下载地址
  10. 揭露动画(Reveal Effect)实现时的注意事项(附上bug-logcat)...