C/C++面试之算法系列--去除数组中的重复数字
去除数组中的重复数字
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++面试之算法系列--去除数组中的重复数字相关推荐
- np.unique( )--去除数组中的重复数字,并进行排序之后输出
该函数是去除数组中的重复数字,并进行排序之后输出. 要求是 arr 里面是相同的维数. import numpy as npresult1 = np.unique([1, 1, 2, 2, 2, 3, ...
- 剑指offer系列-03.数组中的重复数字
剑指offer系列第03题.数组中的重复数字 找出数组中重复的数字.在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内. 数组中某些数字是重复的,但不知道有几个数字重复了,也不 ...
- 去除数组中的重复元素
在一些场景中需要做到数组去重,下面从两种方法来介绍,一种是比较传统的,es6之前就已经出现的:另外一种是es6中的set()可以去除数组中的重复元素,下面我们列举出详细代码: 第一种方法:(index ...
- 题目:查找数组中的重复数字,要求空间复杂度为O(1)(基于Java实现)
题目:查找数组中的重复数字,要求空间复杂度为O(1)(基于Java实现) 题目: 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字 ...
- [剑指offer][JAVA]面试题第[03]题[数组中的重复数字][HashSet]
[问题描述][数组中的重复数字][简单] 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道 ...
- lintcode :Remove Duplicates from Sorted Array II 删除排序数组中的重复数字 II
题目: 删除排序数组中的重复数字 II 跟进"删除重复数字": 如果可以允许出现两次重复将如何处理? 样例 给出数组A =[1,1,1,2,2,3],你的函数应该返回长度5,此时A ...
- 树状数组求逆序对_算法系列之-数组中的逆序对
题目来源 剑指offer 01 题目描述 在数组中如果前一个数字大于后一个数字,则称为这个数字组合组成一个逆序对.输入一个数组,求所有的逆序对的总数. 如 数组 {7,5,6,4} 则它的逆序对是 ( ...
- C++ 小功能算法模板:去除数组中重复的数
如何去除数组中重复的部分 1.不排序,直接去除重复的 #include <iostream> #include <vector> using namespace std; in ...
- LeetCode算法 删除有序数组中的重复项 删除有序数组中的重复项|| C++
目录 题目 删除有序数组中的重复项 参考答案 题目 删除有序数组中的重复项|| 参考答案 题目 删除有序数组中的重复项 给你一个有序数组 nums ,请你原地删除重复出现的元素,使每个元素只出现一次 ...
最新文章
- 用 Java 训练深度学习模型,原来这么简单
- 基于Yolo-V3对卫星图像进行储油罐容积占用率的研究
- 1.2 matlab数值数据的输出格式
- 栈应用_将算式转成按运算符优先级分布(代码、分析、汇编)
- Thinking with Joins
- hdfs java操作_hdfs java操作
- [转]RTH试用手记之“额外功能”
- 一年Android工作经验,一举拿下百度、网易、美团、小米、快手等Offer面经
- matlab灵敏度分析操作,灵敏度分析 使用MATLAB编写.doc
- 计算机时钟同步的原理,华为以太网时钟同步原理介绍(二)
- 实验一计算机网络基础知识,计算机网络实验基础知识 集线器的使用
- Error on rename ofXXXXXX (errno: 152)
- 【bzoj3687】简单题
- 面试必问问题最佳答案
- 如何解决DOSBox 0.74无法运行edit指令
- 1.27 Watermelon
- 11.1-股票基金历年收益率计算
- centos7 解决硬盘内存爆满
- 【FPGA】SCCB通信协议
- POJ 4151/北大百练 4151 电影节 题解(两种方法)贪心算法基础
热门文章
- android系统应用程序,Android调用系统应用程序
- 计算机课程可在平板上做吗,老师做直播,孩子上网课,掌控线上学习就靠这个平板电脑了...
- 无限级导航PHP,jQuery多级无限级导航下拉菜单代码
- 如何让oracle用户不过期,Oracle用户密码设为不过期的两种方法
- php get获取腾讯视频vid,获取腾讯视频源地址链接的方法
- oracle 历史查询是哪个机器发起的,Oracle 查询历史连接主机信息
- STM32F103基本定时器使用
- libusb的交叉编译
- spring之基本介绍以及老版本框架的下载地址
- 揭露动画(Reveal Effect)实现时的注意事项(附上bug-logcat)...