c语言实现在数组中找一个数字显示,C语言找出数组中的特定元素的算法解析
问题描述:一个int数组,里面数据无任何限制,要求求出所有这样的数a[i],其左边的数都小于等于它,右边的数都大于等于它。能否只用一个额外数组和少量其它空间实现。
思路:如果能用两个辅助数组,那么相对来说简单一点,可定义数组Min和数组Max,其中Min[i]表示自a[i]之后的最小值(包括a[i]),Max[i]表示自a[i]之前元素的最大值。有了这两个辅助数组后,对于a[i],如果它大于Max[i-1]并且小于Min[i+1],那么就符合要求。
但是题目要求是只用一个额外数组,其实Max数组可以省去,完全可以边判断边计算,这是因为Max[i]是自左往右计算的,而判断时也是自左往右,两个过程正好可以合起来。只需用一个变量Max保存一下当前的最大值即可。下面给出两种方法的代码实现。
参考代码:
//函数功能 : 找元素
//函数参数 : pArray指向数组,len为数组的元素个数
//返回值 : 无
void FindElements_Solution1(int *pArray, int len)
{
if(pArray == NULL || len <= 0 )
return ;
int *pMin = new int[len];
int *pMax = new int[len];
int i;
pMax[0] = pArray[0];
for(i = 1; i < len; i++) //计算自i往前最大值的辅助数组
pMax[i] = (pMax[i-1] >= pArray[i])? pMax[i-1]: pArray[i];
pMin[len-1] = pArray[len-1];
for(i = len - 2; i >= 0; i--) //计算自i开始最小值的辅助数组
pMin[i] = (pMin[i+1] <= pArray[i])? pMin[i+1]: pArray[i];
if(pArray[0] <= pMin[0]) //检查第1个元素是否满足条件
cout<
for(i = 1; i < len - 1; i++)
{
if(pArray[i] >= pMax[i-1] && pArray[i] <=pMin[i+1]) //满足这个关系式的元素符合要求
cout<
}
if(pArray[len-1] >= pMax[len-1]) //检查第len个元素是否满足条件
cout<
cout<
delete [] pMin;
delete [] pMax;
pMin = pMax = NULL;
}
void FindElements_Solution2(int *pArray, int len)
{
if(pArray == NULL || len <= 0 )
return ;
int *pMin = new int[len];
int Max;
int i;
Max = pArray[0];
pMin[len-1] = pArray[len-1];
for(i = len - 2; i >= 0; i--) //计算自i开始最小值的辅助数组
pMin[i] = (pMin[i+1] <= pArray[i])? pMin[i+1]: pArray[i];
if(pArray[0] <= pMin[0]) //检查第1个元素是否满足条件
cout<
for(i = 1; i < len - 1; i++)
{
if(pArray[i] >= Max && pArray[i] <=pMin[i+1]) //满足这个关系式的元素符合要求
cout<
Max = (Max < pArray[i])? pArray[i]: Max; //更新当前最大值
}
if(pArray[len-1] >= Max) //检查第len个元素是否满足条件
cout<
cout<
delete [] pMin;
pMin = NULL;
}
找出数组中两个只出现一次的数字(数组) 问题描述:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。
思路:如果只有一个数字只出现一次,而其他都出现两次,则直接将所有数字做一次异或运算即可,因为相等的数字异或一下结果为0。如果有两个数字只出现一次,而其他数字出现了两次。该怎么办呢?《编程之美》一书提供了一种方法,即先将所有数字做一次异或运算,得到一个数字,然后以该数字的某非0位作为过滤位,将数组分成两个部分,此时只出现一次的数字会被分到不同的部分。现在问题就转为只出现一次的情况,对每部分分别做异或运算即可。
参考代码:
//函数功能 : 找出数组中两个只出现一次的数字
//函数参数 : arr为源数组,len为数组元素个数,result用来存放结果
//返回值 : 无
void FindIsolateTwo(int *arr, int len, int *result)
{
int i, all = 0, flag = 1;
for(i = 0; i < len ; i++) //所有数异或
all ^= arr[i];
while(!(all&flag)) //寻找过滤位
flag <<= 1;
result[0] = result[1] = 0;
for(i = 0; i < len; i++) //利用过滤位区分
{
if(flag&arr[i])
result[0] ^= arr[i];
else
result[1] ^= arr[i];
}
}
c语言实现在数组中找一个数字显示,C语言找出数组中的特定元素的算法解析相关推荐
- 698. 划分为k个相等的子集:给定一个整数数组 nums 和一个正整数 k,找出是否有可能把这个数组分成 k 个非空子集,其总和都相等。
题目描述 给定一个整数数组 nums 和一个正整数 k,找出是否有可能把这个数组分成 k 个非空子集,其总和都相等. 示例 1: 输入: nums = [4, 3, 2, 3, 5, 2, 1], k ...
- 输入一个整数数组,实现一个函数,来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分,所有偶数位于数组的后半部分。
输入一个整数数组,实现一个函数,来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分,所有偶数位于数组的后半部分. 我们首先会想到常规方法:创建一个临时数组,遍历所给数组中的所有元素,将偶数 ...
- 算法训练 - P1101 ——有一份提货单,其数据项目有:商品名(MC)、单价(DJ)、数量(SL)。定义一个结构体prut,其成员是上面的三项数据。在主函数中定义一个prut类型的结构体数组,输入每
问题描述 有一份提货单,其数据项目有:商品名(MC).单价(DJ).数量(SL).定义一个结构体prut,其成员是上面的三项数据.在主函数中定义一个prut类型的结构体数组,输入每个元素的值,计算并输 ...
- Pandas中xs()函数索引复合索引数据的不同切面数据(索引复合索引中需要的数据):索引列复合索引中的一个切面、索引行复合索引中的一个切面
Pandas中xs()函数索引复合索引数据的不同切面数据(索引复合索引中需要的数据):索引列复合索引中的一个切面.索引行复合索引中的一个切面 目录
- 对一个正整数n,求出n!中末尾0的个数。
对一个正整数n,求出n!中末尾0的个数. 输入 输入有若干行.每一行上有一个整数T,是测试数据组数,接着有T行,每一行包含一个确定的正整数n(n≤1000000000). 输出 对输入行中的每一个数据 ...
- c语言把bit数据合为一个字节,C语言中怎么定义bit型数据
一.通过sbit或者bit定义 sbit映射到IO口(P1^1这种IO口的"位") bit在RAM中的可位寻址空间中,一般用作程序判断的标志位. 认为它们一个对外(sbit),一个 ...
- 找一个网页,用浏览器查看源码并复制,然后尝试解析一下HTML,输出Python官网发布的会议时间、名称和地点——python学习笔记
1. 题目: 找一个网页,例如https://www.python.org/events/python-events/,用浏览器查看源码并复制,然后尝试解析一下HTML,输出Python官网发布的会议 ...
- python链表中删除一个节点数据_python实现单链表中删除倒数第K个节点的方法
本文实例为大家分享了python实现单链表中删除倒数第K个节点的具体代码,供大家参考,具体内容如下 题目: 给定一个链表,删除其中倒数第k个节点. 代码: class LinkedListAlgori ...
- layer中html字符转换,在layer弹出层中通过ajax返回html拼接字符串填充数据的方法...
1,在给一个layer弹出层做checkbox自动选中时,ViewBag传递的时object类型,用不了lambda表达式,代码如下, @foreach (var perm in ViewBag.al ...
最新文章
- python自学免费课堂-推荐5个Python爬虫免费学习资源(B站高赞!)
- 芬兰计算机研究生申请表,芬兰的研究生申请技巧
- Keras情感分析(Sentiment Analysis)实战---自然语言处理技术
- Big Sur:加州一号公路和比克斯比大桥
- 保证业务高效运营 专有云虚拟网络是关键
- swift -- 数组
- php 隐藏地址栏,工具栏,php – 我怎么能隐藏#!在浏览器地址栏上?
- BZOJ——3343: 教主的魔法 || 洛谷—— P2801 教主的魔法
- 向Yahoo Mail的主页学习
- linux上2048游戏程序,如何在Ubuntu中安装2048游戏
- 联想y430完全拆机图解_视频深度拆解:联想IdeaPad Y430全揭秘
- windows11 截屏键无法使用 Print screen
- 腾讯、淘宝的架构大数据你有了解么?大数据技术及算法为你解析
- python学习的一些总结
- Charles浏览器抓包配置
- PostgreSQL do $$ DECLARE 操作
- go语言csv包_golang导出csv
- 深度学习论文: KeepAugment: A Simple Information-Preserving Data Augmentation Approach及其PyTorch实现
- 十六周实验报告 任务二
- android wap push实现