Advertisement

2020计算机专业保研夏令营面经:南大Websoft、南大计算机

阅读量:

南大Websoft

南大部分实验室的面试时间都比较早,例如WebSoft实验室就是其中之一。通过邮件与老师沟通,老师会回复并邀请我加入QQ群,在群内会有学长进行面试安排。在加入的两个同学中,一位是东北大学的,另一位是哈工大威海的。

南大Websoft实验室是我第一场面试,个人发挥较为一般,最终未能通过。

机试

学长负责组织了一场线上面试,通过腾讯会议进行视频和屏幕共享,分享了几道编程练习题,并现场进行代码调试和文件提交。从学长的介绍来看,大多数应试者完成了第二题。

就题目难度而言,本题不涉及水题,整体上难度较大,对算法的时间复杂度有一定要求,对算法功底的要求也非常高。

在解题的过程中,首先会被要求分析题目内容,明确解题思路并评估其时间复杂度。随后会被要求逐步优化时间复杂度,最终达到最优状态。在完成上述步骤后,才会开始编写相应的代码实现。

请添加图片描述
复制代码
    import java.util.*;
    
    class P {
    	int x,y;
    	P(int x,int y) {
    		this.x=x;
    		this.y=y;
    	}
    }
    
    public class Main {
    	public static void main(String[] args) {
    		Scanner in=new Scanner(System.in);
    		int n=in.nextInt();
    		int[][] G=new int[n][n];
    		for(int i=0; i<n; i++) {
    			G[i]=new int[n];
    		}
    		List<P> list=new ArrayList<>();
    		for(int i=0; i<n; i++) {
    			for(int j=0; j<n; j++) {
    				G[i][j]=in.nextInt();
    				if(G[i][j]==1) {
    					list.add(new P(i,j));
    				}
    			}
    		}
    			
    		int pos=0;
    		//当仍有未处理的元素时循环
    		while(pos<list.size()) {
    			//curr:list.get(pos)
    			int i=list.get(pos).x;
    			int j=list.get(pos).y;
    			
    			
    			if(i-1>=0&&G[i-1][j]==0) {
    				G[i-1][j]=G[i][j]+1;
    				list.add(new P(i-1,j));
    			}
    				
    			if(i+1<n&&G[i+1][j]==0) {
    				G[i+1][j]=G[i][j]+1;
    				list.add(new P(i+1,j));
    			}
    				
    			if(j-1>=0&&G[i][j-1]==0) {
    				G[i][j-1]=G[i][j]+1;
    				list.add(new P(i,j-1));
    			}
    				
    			if(j+1<n&&G[i][j+1]==0) {
    				G[i][j+1]=G[i][j]+1;
    				list.add(new P(i,j+1));
    			}
    			pos++;
    		}
    		
    		
    		int x=list.get(list.size()-1).x;
    		int y=list.get(list.size()-1).y;
    		System.out.println(G[x][y]-1);
    			
    	}
    }
    
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读
在这里插入图片描述
复制代码
    #include <bits/stdc++.h>
    using namespace std;
    #define TARGET 24.0
    
    bool judge2(float a,float b) {
    	return (
    		a+b==TARGET || a-b==TARGET ||
    		a/b==TARGET || a*b==TARGET ||
    		b-a==TARGET || b/a==TARGET
    	);
    }
    
    bool judge3h(float a,float b,float c) {
    	return (
    		judge2(a+b,c) || judge2(a-b,c) ||
    		judge2(a*b,c) || judge2(a/b,c) ||
    		judge2(b/a,c) || judge2(b-a,c)
    	);
    }
    
    bool judge3(float a,float b,float c) {
    	return (
    		judge3h(a,b,c) || judge3h(a,c,b) ||
    		judge3h(b,c,a)
    	);
    }
    
    bool judge4h(float a,float b,float c,float d) {
    	return (
    		judge3(a+b,c,d) || judge3(a-b,c,d) ||
    		judge3(a*b,c,d) || judge3(a/b,c,d) ||
    		judge3(b/a,c,d) || judge3(b-a,c,d)
    	);
    }
    
    bool judge4(float a,float b,float c,float d) {
    	return (
    		judge4h(a,b,c,d) || judge4h(a,c,b,d) ||
    		judge4h(a,d,b,c) || judge4h(b,c,a,d) ||
    		judge4h(b,d,a,c) || judge4h(c,d,a,b)
    	);
    }
    
    int main() {
    	float a,b,c,d;
    	cin>>a>>b>>c>>d;
    	if(judge4(a,b,c,d)) {
    		cout<<"True";
    	} else {
    		cout<<"False";
    	}	
    }
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

第三题:
题目描述:输入两个正整数n和m(0<n<=m),
求从n到m,不包含4或62的整数个数。

用例输入:1 100
用例输出:80
用例说明:[1,100]之间不包含4或62的整数个数为80

答题碎碎念:

第一个题目初看确实不难,涉及一个二维数组,计算每个0到1的最短距离即可完成任务。
最初想到的是通过遍历整个数组,每当遇到一个1时,再遍历一遍数组,计算并更新所有0到该1的距离。
这个方法效率极低,其时间复杂度等于O(N^4),因此需要优化。

一开始状态不佳,思考了很久,后来逐渐转向BFS算法。然后,先遍历每一个初始点,增加一步,得到所有直接可达的点,标记为2。接着,遍历数组中的所有标记为2的点,同样的方法可以用于后续的标记点。在最坏情况下,需要对数组进行N次遍历,因此时间复杂度为O(N^3)。

到这里,我原本以为已经达到了最佳效果,但学长指出还有进一步优化的空间。又仔细琢磨了一下,想到通过空间换时间,用一个队列来存放每一层遍历的节点,从而避免了反复遍历。时间复杂度为O(N²),直到这个时候才开始动手编写代码。

第二道题目我觉得不难,可以通过逐步降维来解决,必须使用浮点数。由于只有4个数据,因此可以直接手写代码,无需每次封装成数组进行处理。这里无需优化时间复杂度,因为数据量的问题不大。我很快解决了这道题,学长表示面试中,我这道题完成得最快,还询问我是否之前做过类似题目。

通常在完成前几个问题后,学生通常只能解决两个主要题目。对于第三个问题,若不考虑时间复杂度,问题变得相对简单,只需判断每个数字是否包含数字4或62即可。最初,我想到,由于我们只需计算满足条件的整数数量,无需具体找出这些整数,因此可以采用容斥原理来解决这个问题。在这一思路下,我进行了深入探讨,尝试通过数学公式计算从n到m范围内包含数字k的个数。计算从n到m范围内所有包含数字4的数字个数确实较为复杂,需要考虑多个因素,例如个位为4的数字有m个,但十位为4的数字则不能在个位也为4的情况下重复计算。

学长提醒我考虑字符串的前缀。我最后才想到动态规划的做法,dp[i][j]代表以i开头、长度为j的数字中不包括4或62的个数。那么递推公式就是:
dp[i][j]=dp[0][j-1]+ dp[1][j-1]+ ( i==6?(dp[2][j-1]):0 )+ dp[3][j-1]+ dp[5][j-1]+ dp[6][j-1]+ dp[7][j-1]+ dp[8][j-1]+ dp[9][j-1]
只需要考虑从1到m中不包括4或62的数字个数就可以了。关键是怎么样找到小于等于m。这个可以通过从高到低遍历m的每一位实现。时间原因,我只找到了算法,代码还有问题。

面试

大家好,我简单介绍一下我的项目。我的项目目前还处于初期阶段,主要功能模块尚未完全实现,系统稳定性有待提升。基于以上问题,我对自己的项目进行了深入反思,认为需要更加充分地进行前期准备,以确保项目顺利推进。针对自己简历中的所有项目,我计划在介绍时采用更加专业的方式进行阐述,以展现项目的实际价值和创新点。同时,我也意识到在项目初期可能会遇到一些技术难点,因此需要提前做好应对策略。为了更好地帮助后面的同学,我对每个项目都准备了详细的中文和英文版本的介绍材料,以便大家能够更全面地了解项目的背景、技术实现和未来规划。

由于我本科就读于湖南,但家乡在山东,因此被询问了为何选择到湖南上大学,以及为何选择南大?此外,是否也报名了其他研究组或高校?离散数学课程学了些什么?能否解释闭包的概念?简历中的一个项目具体信息及流程是怎样的?团队成员共有几名,分工是怎样的?未来的职业规划是什么?

论文汇报

给了一篇论文,要求提前学习、制作PPT、现场汇报。

这篇文章涉及知识图谱领域,由于我这方面专业知识储备不足,加之时间安排紧张,所以在论文汇报时整体表现一般。针对汇报后提出的相关问题,我也未能给出满意回答。因此,我意料之中的结果是论文被拒,这个情况出乎我的意料。

南大计算机(取得offer)

具体地,分为面试与笔试两个部分。

面试

在编译原理课程中,如何消除二义性问题? 由于我在编译原理课程中表现优异,因此被问及了该问题。

  • 请用英语简要介绍栈溢出(stack overflow)及其相关概念。
  • 当从开源代码库下载代码时,如果遇到编译错误,应该如何排查?
  • 作为C++程序员,在动态操作内存时应注意事项包括哪些?
  • 溢出在哪些特定情况下会对程序运行造成危害?而在哪些情况下则不会带来严重问题?
  • 简述KMP算法的基本原理及其在字符串匹配中的应用。

笔试

这两道题均为选择题,涉及程序阅读。其中一道题目要求判断程序的功能,另一道则考察程序的输出结果。这两道题均为选择题,涉及程序阅读。其中一道题目要求判断程序的功能,另一道则考察程序的输出结果。

已知[X] =X0X1…Xn(n为整数),则它的模数是多少?当时我并没有做出来。已知[X] =X0X1…Xn(n为整数),则它的模数是多少?当时我并没有做出来。

  • 与2n时间复杂度的级别相同的是?
    A. n! B. 3n C.2n+1

南大计算机科学与技术专业对计算机基础知识的重视程度较高。在面试中,我认为笔试环节的考核方式非常客观公正。具体来说,在专业笔试环节,主要通过随机抽题的方式进行考核,确保每位考生的答题机会均等。最终,我凭借扎实的专业知识和良好的临场发挥,顺利斩获了offer letter。

全部评论 (0)

还没有任何评论哟~