两道考研算法设计题- 2010 2013
2010:
设将n(n>1)个整数存放到一维数组R中。试设计一个在时间和空间两方面都尽可能高效的算法,将R中保存的序列循环左移P(0<P<n)个位置,即将R中的数据由(x0,x1,…,xn-1)变换为(xp,xp+1,…,xn-1,x0,x1,…,xp-1)。要求:
(1)给出算法的基本设计思想。
(2)根据设计思想,采用C或C++或JAVA语言描述算法,关键之处给出注释。
(3)说明设计算法的时间复杂度和空间复杂度。
【解析】:
(1)前P个数依次进队,while(i<n-p) A[i]=A[i+p];P个数依次出队,进入数组末尾;
或者,使用数学里的分析方法:
循环左移p个位置,也就是将数组分为2部分,前一部分从0到p-1,后一部分从p到n-1,将数组的前一部分跟后一部分进行了交换。
首先逆序前一部分,然后逆序后一部分,左后整个逆序。以此实现循环左移:酷酷的!
其数学原理:(a-1b-1)-1=ba
代码如下:
1 #include<iostream> 2 #include<string> 3 using namespace std; 4 5 void reverse(int a[],int begin,int end) 6 { 7 int i = begin, j = end,temp; 8 while (i < j) 9 { 10 a[i] = a[j]; 11 a[j] = temp; 12 ++i; 13 --j; 14 } 15 } 16 void loop(int *a, int len, int p) 17 { 18 reverse(a, 0, p - 1); 19 reverse(a, p, len-1); 20 reverse(a, 0, len-1); 21 } 22 23 int main() 24 { 25 int a[5] = { 1, 2, 3, 4, 5 }; 26 loop(a, 5, 3); 27 for (int i = 0; i < 5; i++) 28 cout << a[i] << " "; 29 return 0;//输出结果:4 5 1 2 3 30 }
View Code
(3)时间复杂度O(N),空间复杂度O(1)。
2013:
【解析:】
(1)算法思想:
首先保存整数序列的第一个数到res中,并计数count=1,然后从后往前(从前往后也一样)遍历,若是第二个数等于res,则count自增,否则count自减,若是count等于0,则res保存整数序列中将要遍历的下一个整数。
其次,我们来进行验证,遍历一遍整数序列,若是整数等于上一步中的res,则count自增,否则不做处理;如果最后count大于n/2,则说明res就是主元素,否则返回-1,说明主元素不存在。
(2)c++实现的代码如下:
1 #include<iostream> 2 using namespace std; 3 int getNum(int *arr, int len) 4 { 5 int res=arr[0],count=1; 6 while (len > 0) 7 { 8 if (arr[len] == res) 9 count++; 10 else 11 { 12 --count; 13 if (count == 0) 14 res = arr[len - 1]; 15 } 16 len--; 17 } 18 return res; 19 } 20 int verify(int *arr, int len) 21 { 22 int count = 0; 23 int num = getNum(arr, len); 24 for (int i = 0; i < len;i++) 25 if (num == arr[i]) 26 ++count; 27 if (count>len / 2) 28 return num; 29 else 30 return -1; 31 } 32 int main() 33 { 34 int arr[] = { 0,5,5,3,5,7,5,5 }; 35 int result = verify(arr, 8); 36 cout << result << endl; 37 return 0; 38 }
View Code
update-2015-8-20:网上一段更简洁的代码:
1 class Solution { 2 public: 3 int majorityElement(vector<int> &num) { 4 int nTimes = 0; 5 int candidate = 0; 6 for(int i = 0; i < num.size(); i ++) 7 { 8 if(nTimes == 0) 9 { 10 candidate = num[i]; 11 nTimes = 1; 12 } 13 else 14 { 15 if(candidate == num[i]) 16 nTimes ++; 17 else 18 nTimes --; 19 } 20 } 21 return candidate; 22 } 23 };
(3)数组遍历了两次,但是每次都是O(n),空间上只使用了几个辅助变量,所以时间复杂度为O(n),空间复杂度为O(1)。
转载于:https://www.cnblogs.com/chess/p/4732555.html
两道考研算法设计题- 2010 2013相关推荐
- 算法设计题3.16-栈和队列-第3章-《数据结构习题集》-严蔚敏吴伟民版
习题集完整源码部分 第3章 栈和队列 ...
- 算法设计题3.27-栈和队列-第3章-《数据结构习题集》-严蔚敏吴伟民版
习题集完整源码部分 第3章 栈和队列 ...
- c语言数据结构算法设计题,数据结构题集(C语言版)算法设计题答案[].doc
数据结构题集(C语言版)算法设计题答案[].doc 第一章 绪论 1.16 void print_descending(int x,int y,int z)// 按从大到小顺序输出三个数 { scan ...
- 数据结构设计_数据结构算法设计题学起来很困难怎么破
在数据结构学习时候最难的也是最重要的是算法的学习,很多同学不知道一些算法应该怎么学,也不知道应该掌握到什么程度,往往事倍功半.在此特写此篇文章,介绍一下程序设计题的算法怎么应对. 学习方法推荐: 第一 ...
- 华为外包l两道面试算法题。
今日下午刚结束面试.一共两技术人员面的,一人出了一道算法题,记录下,并为以后做些准备,由于远程面试,所以没有代码测试,不知道行不行的通,且行且看吧. 1.输入为String 字母卡片(可以重复)和一个 ...
- 考研数据结构历年真题(算法设计题)整理
文章目录: 2014年 1.带头双循环链表删除一个结点返回其值 2.栈入队
- 保研面试 算法题_面试挂在了一道 LRU 缓存算法设计题
前言 好吧,有人可能觉得我标题党了,但我想告诉你们的是,前阵子面试确实挂在了 RLU 缓存算法的设计上了. 当时面试官问到这个题的时候,很快给了一个思路,但是手写的时候,发现自己没有深刻理解它,加上当 ...
- 数据结构练习题——图(算法设计题)
(1)分别以邻接矩阵和邻接表作为存储结构,实现以下图的基本操作: ① 增加一个新顶点v,InsertVex(G, v): ② 删除顶点v及其相关的边,DeleteVex(G, v); ③ 增加一条 ...
- 数据结构算法设计题 (超详细)
整理日期:2022-12-08 目录 一.线性表 二.栈和队列 三.数组和广义表 四.树和二叉树 五.图 六.查找算法 七.排序算法 一.线性表 (1)将两个递增的有序链表合并为一个递增的有序链表.要 ...
- 两道有趣的逻辑推理题
海盗分金币 问题: 有5个海盗,按照等级从5到1排列.最大的海盗有权提议他们如何分享100枚金币.但其他人要对此表决,如果多数(所有人中的多数)反对,那他就会被杀死.他应该提出怎样的方案,既让自己拿到 ...
最新文章
- 面试官:你们Redis故障过吗,怎么解决?
- 【Xamarin开发 Android 系列 5】 Xamarin 的破解
- 有哪些py写的黑科技_2020年汽车界又新增了哪些值得一提的黑科技产品?
- DELL台式机BIOS常见问题
- tp5 cache缓存简单使用
- 记一次 .NET医院公众号程序 线程CPU双高分析
- 深入浅出讲解语言模型
- 标准正态分布表_表达矩阵的归一化和标准化,去除极端值,异常值
- Web项目替换jar包中的文件的方法
- 细数阿里云服务器的十二种典型应用场景
- Windows Server Failover Cluster 使用的协议和端口
- 国外 java 源码_将近100多个国外优秀Java程序员的编程源代码JAVA源码下载
- 百度地图api设置点的自定义图标不显示
- 谈谈写程序与学英语 --宋劲杉
- 一个简单文本分类任务-EM算法-R语言
- Windows查看ssh公钥方法
- 为什么要做访问学者?
- 祝愿天下所有运维的服务器永不宕机!
- Java中的byte[]/char[]/int/String数据类型转换
- python 模拟键盘自动打字敲英语文章