两道考研算法设计题- 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 }

(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 }

(3)数组遍历了两次,但是每次都是O(n),空间上只使用了几个辅助变量,所以时间复杂度为O(n),空间复杂度为O(1)。

时间: 2024-10-31 01:51:23

两道考研算法设计题- 2010 2013的相关文章

从数组循环左移问题中浅谈考研算法设计的规范代码

问题:设将n(n>1)个整数存放到一维数组R中.设计一个算法,将R中的序列循环左移p(0<p<n)个位置,即将R中的数据由{X0,X1,...,Xn-1}变换为{Xp,Xp+1,...,Xn-1,X0,X1,...,Xp-1}.要求:写出本题的算法描述. 分析: 本题不难,要实现R中序列循环左移p个位置,只需先将R中前p个元素逆置,再将剩下的元素逆置,最后整体逆置操作即可.本题算法描述如下: 1 #include <iostream> 2 using namespace st

两道经典算法题-吉比特2017秋招笔试

阅读目录 求素数 最大差值 回到顶部 求素数 输入M.N,1 < M < N < 1000000,求区间[M,N]内的所有素数的个数.素数定义:除了1以外,只能被1和自己整除的自然数称为素数 输入描述: 两个整数M,N 输出描述: 区间内素数的个数 示例1 输入 2 10 输出 4 #include<iostream> #define K 1000001 using namespace std; char p[K+1] = {1,1,0}; //数组前三个数 0 1 2 分别

第三章算法设计题

3.2.8 /***循环队列基本操作***/ #include<cstdlib> #include<iostream> #include<fstream> using namespace std; #define MAXQSIZE 100 #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef int QElemType; typedef int Status; typedef struct { QElemTyp

二叉树相关算法设计题

一. 题目: 二叉树按层打印,同时输出格式满足:打印完一层要换行,每一行的行首标明:level  i(i=1,2,3...层) 思路:1.先把二叉树的层次遍历搞懂:    用队列实现,原理是:根节点入队,然后在队列不空的时候循环,循环体操作为:抛出队首元素并向队尾添加该抛出节点的左右子节点(如果不为空的话) 2.题目有两个额外的要求.a.换行打印.b.打印行号.其实就是让我们在层次遍历时遇到每一层的最右节点出队打印时换行并打印行号, 其实a和b是一样的,只要知道怎么换行,在换行时加上level+

[sdut]2623+[sdut]2878//四五届省赛中的两道数学期望

两道数学期望的题今天一起总结上来. 1.the number of steps(第四届省赛) 1 #include <iostream> 2 #include <string.h> 3 #include <iomanip> 4 using namespace std; 5 double dp[100][100]; 6 int n; 7 double a,b,c,d,e; 8 9 int main() 10 { 11 while(cin>>n&&

《算法之道》精华 算法设计部分

<算法之道>精华 算法设计部分 本书作者邹恒明,作者另有一本书<数据结构之弦>,以及<操作系统之哲学原理>都是非常好的书 这本书能够算得上是深入浅出.文笔非常好,作者加入了非常多自己的思考 本文仅包含算法设计部分,算法分析略去,并没有严格依照章节顺序来记录 附录 算法随想 有人喜欢遍历,希望踏遍千山万水,人生丰富多彩:有人一生贪婪,眼界不宽,及时行乐:有人注定穷搜,辛辛苦苦,收获有限:有人善用时空均衡,用最少的时间办最多的事情.十分精明:有人会分治,再难的问题也能解决.

设计的两道面试题C++

1.函数指针的,说明下面程序会出现编译错误吗?如果有怎么解决: class A { private : typedef void (*FUNC)(void); Func a; public : void funcA() {} void funcB() { a = funcA(); a(); } } void main() { A a; a.funcB(); } 2.map应用,下列函数的执行结果 #include <map> #include <iostream> static c

逛园子,看到个练习题,小试了一把(淘宝ued的两道小题)

闲来无事,逛园子,充充电.发现了一个挺有意思的博文,自己玩了一把. 第一题:使用 HTML+CSS 实现如图布局,border-widht 1px,一个格子大小是 60*60,hover时候边框变为橘红色(兼容IE6+,考虑语义化的结构) 效果图: 简单分析一下: 使用伪类 :hover的时候相对定位 改变z-index, 代码如下: 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta c

《计算机算法设计与分析》v4 第1章 算法概述 算法实现题答案

博主今年刚上大三,正好开算法这门课.由于博主本人比较喜欢算法但又比较懒,啃不动算法导论,所以决定拿这本书下手. 这本书是王晓东的第四版<计算机算法设计与分析>.初步打算将每章后面的算法题都用代码实现. 有些题跟某个ACM题目很像,我会把该ACM题的链接贴上.有的题没OJ交所以可能是错的.如有发现,还望指出. 1-1 统计数字问题 http://poj.org/problem?id=2282 这个题要按位分解,一位一位的来处理. #include<iostream> #include