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相关推荐

  1. 算法设计题3.16-栈和队列-第3章-《数据结构习题集》-严蔚敏吴伟民版

    习题集完整源码部分 第3章  栈和队列                                                                                 ...

  2. 算法设计题3.27-栈和队列-第3章-《数据结构习题集》-严蔚敏吴伟民版

    习题集完整源码部分 第3章  栈和队列                                                                                 ...

  3. c语言数据结构算法设计题,数据结构题集(C语言版)算法设计题答案[].doc

    数据结构题集(C语言版)算法设计题答案[].doc 第一章 绪论 1.16 void print_descending(int x,int y,int z)// 按从大到小顺序输出三个数 { scan ...

  4. 数据结构设计_数据结构算法设计题学起来很困难怎么破

    在数据结构学习时候最难的也是最重要的是算法的学习,很多同学不知道一些算法应该怎么学,也不知道应该掌握到什么程度,往往事倍功半.在此特写此篇文章,介绍一下程序设计题的算法怎么应对. 学习方法推荐: 第一 ...

  5. 华为外包l两道面试算法题。

    今日下午刚结束面试.一共两技术人员面的,一人出了一道算法题,记录下,并为以后做些准备,由于远程面试,所以没有代码测试,不知道行不行的通,且行且看吧. 1.输入为String 字母卡片(可以重复)和一个 ...

  6. 考研数据结构历年真题(算法设计题)整理

    文章目录: 2014年 1.带头双循环链表删除一个结点返回其值 2.栈入队

  7. 保研面试 算法题_面试挂在了一道 LRU 缓存算法设计题

    前言 好吧,有人可能觉得我标题党了,但我想告诉你们的是,前阵子面试确实挂在了 RLU 缓存算法的设计上了. 当时面试官问到这个题的时候,很快给了一个思路,但是手写的时候,发现自己没有深刻理解它,加上当 ...

  8. 数据结构练习题——图(算法设计题)

    ​ (1)分别以邻接矩阵和邻接表作为存储结构,实现以下图的基本操作: ① 增加一个新顶点v,InsertVex(G, v): ② 删除顶点v及其相关的边,DeleteVex(G, v); ③ 增加一条 ...

  9. 数据结构算法设计题 (超详细)

    整理日期:2022-12-08 目录 一.线性表 二.栈和队列 三.数组和广义表 四.树和二叉树 五.图 六.查找算法 七.排序算法 一.线性表 (1)将两个递增的有序链表合并为一个递增的有序链表.要 ...

  10. 两道有趣的逻辑推理题

    海盗分金币 问题: 有5个海盗,按照等级从5到1排列.最大的海盗有权提议他们如何分享100枚金币.但其他人要对此表决,如果多数(所有人中的多数)反对,那他就会被杀死.他应该提出怎样的方案,既让自己拿到 ...

最新文章

  1. 面试官:你们Redis故障过吗,怎么解决?
  2. 【Xamarin开发 Android 系列 5】 Xamarin 的破解
  3. 有哪些py写的黑科技_2020年汽车界又新增了哪些值得一提的黑科技产品?
  4. DELL台式机BIOS常见问题
  5. tp5 cache缓存简单使用
  6. 记一次 .NET医院公众号程序 线程CPU双高分析
  7. 深入浅出讲解语言模型
  8. 标准正态分布表_表达矩阵的归一化和标准化,去除极端值,异常值
  9. Web项目替换jar包中的文件的方法
  10. 细数阿里云服务器的十二种典型应用场景
  11. Windows Server Failover Cluster 使用的协议和端口
  12. 国外 java 源码_将近100多个国外优秀Java程序员的编程源代码JAVA源码下载
  13. 百度地图api设置点的自定义图标不显示
  14. 谈谈写程序与学英语 --宋劲杉
  15. 一个简单文本分类任务-EM算法-R语言
  16. Windows查看ssh公钥方法
  17. 为什么要做访问学者?
  18. 祝愿天下所有运维的服务器永不宕机!
  19. Java中的byte[]/char[]/int/String数据类型转换
  20. python 模拟键盘自动打字敲英语文章

热门文章

  1. python装饰器Decorators
  2. 【SimpleITK】坐标次序问题
  3. coco数据集大小分类_COCO数据集的简单介绍
  4. 蓝桥杯2021年第十二届C++省赛第七题-砝码称重
  5. 《Android音视频开发》— Android 书籍
  6. C语言 — 转义字符
  7. Labview学习笔记(一)
  8. P3986 斐波那契数列
  9. Go---第六章:方法(小知识点笔记)
  10. Docker简介及Linux下安装