2019年中科院信工所复试经验帖

总述:

        今天是4月1日愚人节,距离复试结束已经3天了,很幸运收到了信工所拟录取通知。复试成绩83.74分。因为复试刚刚结束,趁着自己还没忘,想记录一些复试经验,给师弟师妹们考研复试做为参考。我一志愿报的二室,二志愿报的四室,均参加了复试。

总流程:

        信工所的2019年复试流程如下:

日期

 

复试安排

 

3月28日

(周四)

7:10—9:00

空腹体检

自行前往至中关村医院

9:00—9:30

统一乘车回信息工程研究所

研究所安排车辆回所

9:40—10:10

审核复试学生资格

研究所2号楼(B1栋)2101室

10:20开始

考生参加各部门复试

点另行通知

二室

        体检结束,统一乘车回到了闵庄那个地方,审核政审表等必要文件。然后二室的就可以在对面第二研究室接受复试了。二室的复试包含心理测试+英语口语+机试+专业课面试,为节省时间是分流测试的,顺序可能和我的不一样。二室面试90%。心理测试和机试不算分,但是我个人建议机试尽量好好准备,老师会看的。

二室-心理测试部分

        这个部分其实是最简单的,拿到一本小册子,按照自己的想法去选择就好,其实主要是测试学生心理是否过激。

二室-英语口语部分

        英语口语和专业课面试是分开进行的,单独在一间屋子里面,进去之后出于礼貌可以先给老师打声招呼,老师会让大家坐下,今年和往年形式差不多,包含三个流程:自我介绍+话题+专业课翻译

自我介绍:这个是要提前准备的,大概3分钟左右,介绍的点一般包含姓名,本科院校,专业,兴趣,获奖情况等等。

话题:是采用抽取小纸条的形式,我抽到的是“为什么选择读研究生而不是去工作?”   大概也要讲2到3分钟吧

专业课翻译:抽取小纸条,朗读并翻译。大概有五六行左右,没有太多,我抽到的是关于C++类的特性相关的

二室-机试部分

        往年是linux+vim+人工判别给分,在这之前我还特意在虚拟机上搭建了linux,平时刻意在上面做题。今年变化是采用oj的形式,系统判别。题目分为AB卷,上午做A,下午B,每套卷子有3个题目。一般考察数组+二叉树+字符串+动态规划等。复试前需要练习几道题目。我做的B题;题目回忆:

B-1:大小写转换

题目描述:输入一个字符串,大写转小写,小写转大写,并输出最后结果。

#include
#include
int main()
{
	int N,n,i,l;
	char str[1000];
	scanf("%d",&N);
	getchar();
	while(N--)
	{
		scanf("%s",&str);  
 //       l=strlen(str);
		for(i=0;str[i]!='\0';i++)
		{
			if(str[i]>='a'&&str[i]<='z')
			{
				str[i]=str[i]-32;
			}
		    else
			{
				str[i]=str[i]+32;
			}
		}
       for(i=0;str[i]!='\0';i++)
	   {
		printf("%c",str[i]);
	   }
		printf("\n");
	}
	return 0;
}

B-2:数组元素循环左移

题目描述:题目是这样的:设将n(n>1)个整数存放到一维数组R中,设计一个算法,将R中的序列循环左移P(0

分析一下:

      这题要的是如下的这种效果

      例如数组元素为

           元素  1    2    3    4    5

           下标  0    1    2    3    4

      假如循环左移3个位置,变为

           元素   4    5   1    2    3

           下标   0    1   2    3    4

      显然,题目中所说的循环左移,就是指将数组中的每一个元素向左移动P个位置

#include 
using namespace std;
 
void reverse(int *arr , int begin , int end)
{
	int i , j;
	for(i = begin , j = end ; i < j ; i++ , j--)
	{
		int t;
		t = arr[i];
		arr[i] = arr[j];
		arr[j] = t;
	}
}
 
void function(int *arr , int n , int p)
{
	reverse(arr,0,p-1);
	reverse(arr,p,n-1);
	reverse(arr,0,n-1);
}
 
 
void display(int *arr , int n)
{
	int i;
	for(i = 0 ; i < n ; i++)
	{
		cout<

2019年中科院信工所复试经验帖_第1张图片

B-3:数塔问题

题目描述:

下面以一道经典的动态规划题目说明动态规划的思想。

先看题目:如下图(图片来自百度图片)是一个数塔,从顶部出发在每一个节点可以选择向左或者向右走,一直走到底层,要求找出一条路径,使得路径上的数字之和最大.

2019年中科院信工所复试经验帖_第2张图片

思路分析: 
这道题目如果使用贪婪算法不能保证找到真正的最大和。 
在用动态规划考虑数塔问题时可以自顶向下的分析,自底向上的计算。 
从顶点出发时到底向左走还是向右走应取决于是从左走能取到最大值还是从右走能取到最大值,只要左右两道路径上的最大值求出来了才能作出决策。同样的道理下一层的走向又要取决于再下一层上的最大值是否已经求出才能决策。这样一层一层推下去,直到倒数第二层时就非常明了。 
所以第一步对第五层的8个数据,做如下四次决策: 
如果经过第四层2,则在第五层的197中肯定是19 
如果经过第四层18,则在第五层的710中肯定是10 
如果经过第四层9,则在第五层的104中肯定是10 
如果经过第四层5,则在第五层的416中肯定是16 
经过一次决策,问题降了一阶。5层数塔问题转换成4层数塔问题,如此循环决策…… 最后得到1阶的数塔问题。

算法实现:首先利用一个二维数组data存储数塔的原始数据(其实我们只使用数组data一半的空间,一个下三角矩阵),然后利用一个中间数组dp存储每一次决策过程中的结果(也是一个下三角矩阵)。 
初始化dp,将data的最后一层拷贝到dp中。dp[n][j] = data[n][j] (j = 1, 2, …, n) 其中,n为数塔的层数。 
在动态规划过程汇总,我们有dp[i][j] = max(dp[i+1][j], dp[i+1][j+1]) + data[i][j],最后的结果保存在dp[0][0]中。 
对于上面的数塔,我们的data数组如下:

9

12

15

10

6

8

2

18

9

5

19

7

10

4

16

而我们的dp数组如下:

59

50

49

38

34

29

21

28

19

21

19

7

10

4

16

#include 
#include 
 
using namespace std;
 
/************************************************************************/
/* 数塔问题                                                               */
/************************************************************************/
const int N = 50;//为了算法写起来简单,这里定义一个足够大的数用来存储数据(为了避免运算过程中动态申请空间,这样的话算法看起来比较麻烦,这里只是为了算法看起来简单)
int data[N][N];//存储数塔原始数据
int dp[N][N];//存储动态规划过程中的数据
int n;//塔的层数
 
/*动态规划实现数塔求解*/
void tower_walk()
{
    // dp初始化
    for (int i = 0; i < n; ++i)
    {
        dp[n - 1][i] = data[n - 1][i];
    }
    int temp_max;
    for (int i = n - 1; i >= 0; --i)
    {
        for (int j = 0; j <= i; ++j)
        {
            // 使用递推公式计算dp的值
            temp_max = max(dp[i + 1][j], dp[i + 1][j + 1]);
            dp[i][j] = temp_max + data[i][j];
        }
    }
}
 
/*打印最终结果*/
void print_result()
{
    cout << "最大路径和:" << dp[0][0] << '\n';
    int node_value;
    // 首先输出塔顶元素
    cout << "最大路径:" << data[0][0];
    int j = 0;
    for (int i = 1; i < n; ++i)
    {
        node_value = dp[i - 1][j] - data[i - 1][j];
        /* 如果node_value == dp[i][j]则说明下一步应该是data[i][j];如果node_value == dp[i][j + 1]则说明下一步应该是data[i][j + 1]*/
        if (node_value == dp[i][j + 1]) ++j;
        cout << "->" << data[i][j];
    }
    cout << endl;
}
 
int main()
{
    cout << "输入塔的层数:";
    cin >> n;
    cout << "输入塔的节点数据(第i层有i个节点):\n";
    for (int i = 0; i < n; ++i)
    {
        for (int j = 0; j <= i; ++j)
        {
            cin >> data[i][j];
        }
    }
 
    tower_walk();
    print_result();
}

二室-专业课面试部分

        其实专业课面试一个书本上面的知识都没有问我,老师更多的是想看你平时的代码能力和科研成就。老师的问题都是从你的简历出发。问项目,问比赛,问具体的技术点等。我的问题如下,就不放置我的回答了。

  1. 首先让做中文自我介绍,我叫….
  2. 问题一:你知道数据库查询可以怎么优化吗?select底层的东西是什么啊?mysql是怎么优化这个的?
  3. 问题二:python中不用第三个变量怎么进行交换两个变量的值
  4. 问题三:lucence的检索方式有几种?分别介绍一下
  5. 你搭建过zookeeper集群,你知道这种集群为什么都要用奇数台机器吗?你都用集群做了什么事情?
  6. 问题五:你说一下反射的原理吗,是怎么实现的?
  7. 问题六:项目+毕业设计
  8. 问题七:为什么想要做这个项目,你都用到了哪些技术?
  9. 问题八:linux问题:在一个文件夹下面怎么使用命令找含有某字段的文件
  10. 问题九:Python中对哪些库比较熟悉啊?
  11. 问题十:学硕?专硕?
  12. 问题十一:你想做什么方向?如果这个方向名额不够了,你愿意接收调剂吗?

        好的,以上二室整个复试流程就结束了,我看时间还早(大概1:30左右),然后我就打车去了益园第四实验室(偏信息安全),和二室一样先提交各种表。我在四室只进行了面试和英语口语部分,不知是因为二志愿还是本来就是这么安排的。

.........................................................................................................................................................

四室:

        到了四室之后,我大体看了一下二志愿来的情况,可能是我当时去的早些,我应该是第一个二志愿面试的学生。老师首先安排了我专业课面试。

四室-专业课面试:

        个人感觉四室老师还是比较和蔼的,问的问题比较温和,二室就比较直接了,很多问题老师心里是有具体答案的,不会的话最好给老师说清楚自己不懂就好,千万不要不懂装懂。

  1. 自我介绍
  2. 问项目
  3. 说一下DES算法吧
  4. 你未来的打算是什么
  5. 你为什么报了两个实验室,你报二室和四室的原因是什么啊
  6. 你的项目代码量大概有多少啊
  7. 你参加比赛挺多的,你讲一下美赛数学建模吧!你们的题目和模型

四室-英语口语

        这个实验室英语口语问的没有章法,旁边有个沙漏,要等沙漏流完,英语口语才可以结束,所以你如果回答问题说的比较少的话,老师就会问很多问题。

  1. 英文自我介绍
  2. 你的业余时间兴趣
  3. 你为什么选择读研
  4. 你最喜欢的运动项目
  5. 用英文介绍一下你的一个项目吧
  6. 你那个博客系统访问量大概是多少啊

        大概这些就是28号那天我的所有经历,信工所在出复试名单的工作上还是比较有效率的,30号就出拟录取名单了。非常幸运去了我的第一志愿-第二研究室。总的来讲,信工所生源是越来越好的,今年很多985,211大佬报考,对于双非歧视不歧视这个问题,我认为是不歧视的。欢迎大家报考信工所,未来可期!

 

 

你可能感兴趣的:(其他,IT之路)