21-0003 2020年3月25日的面试,开发岗位遇到的题目

1.简历投递情况

前言:考研呢,自然是失败了,开始了一边找工作,一边写毕设的日子,于我而言项目经历并不是特别的充足,而且考研时候学习的知识还剩下一丢丢,简历相对而言是比较空荡荡的,写代码的速度也比较慢,可能我就不适合做程序员?不,我就是程序员。
先说简历投递:

青果灵动【接了个电话就没消息了】
乐道互动【实习过两个月,但是再投简历的时候完全没有消息】
携程【能力测试题写完就没啦】
快看世界【牛客网上投递之后没了消息】
华为【目前写了笔试题】
北京庚图【笔试+面试,效果不太好,估计是凉了】
美团【目前只是投递了简历】
三七互娱【写了笔试题】
博乐科技【写了笔试题】
京东方【莫得消息】
埃森哲【同上】
尚游游戏【没有消息】
帆软【没有消息】
科大讯飞【么有消息】
搜狗【么有消息】

跟人觉得投递还算比较积极,但是效果并不是很好,学习的动力并不是很足,但是我有学习的欲望,不想学的时候就开始写博客,写累了就去学习,话说我已经两个星期没有碰毕设了,似乎别人的都快完成啦,真的!我比较菜?不,我不承认。

2.知识掌握情况

2.1 C++

掌握不牢固的:

  • 遇到tree、map就开始发慌,二叉树的那一大堆东西掌握的不是很好,图的掌握情况更不好,相关的知识点总是记混。
  • 字符串处理的相关函数掌握不牢固,有个分割函数,总觉得用过,但就是想不起来。
  • 数据类型的转化也不是特比好,比如string转化为int就比较恶心,当时没想出来可以使用什么函数,只能自己写函数处理。
  • 数据的存储、编译过程、内存的管理掌握的并不是很好,比如虚函数列表,父类指针直线子类对象等,感觉很乱。
  • 关于循环中的++i,i++等究竟应该怎么加,退出条件要不要等号,这样的问题通常需要想很久。
  • 最后一个,与代码相关的:递归的使用,非常之不熟练,即使能够看懂别人的代码,但是自己依旧不能复现。
  • 与线程有关的,与Linix有关的,与Qt有关,与MySQL有关的,看到就比较慌,不知所措。

比较熟练的:

  • 数组、动态数组、堆栈、向量、队列这样的数据结构,使用起来都比较好,但是初始化的时候需要编译器的提示,自己总是忘记初始化的规则。
  • 排序算法也还好,快排现在应该是可以实现的,其他比较高级的LSD、MSD、shell sort等知道原理,自己实现可能要花费一些时间。
  • 面向对象的思想以及类的使用,比较熟练,现在写稍稍长一点的代码都倾向于使用面向对象,而不是面向过程。
  • 文件处理这一块虽然谈不上精通,但也用的得心应手。

2.2 Unity 3d

不太熟练的地方:有很多

  • Unity用了两年,基本的操作都会,但是需要回忆,考研的时候没有Unity好久都不实用了,Unity的基础知识现在不是特别牢固。
  • Unity中函数的执行过程,以及执行顺序?
  • Unity中的渲染流水线都有哪些过程?会进行什么操作?
  • Unity中的协程与线程的异同有哪些?
  • 还有好多Unity的相关问题,似乎都不是特别的了解?

3.笔试面试情况

现在做过的笔试题目,只有北京庚图,华为,三七互娱,效果不是特别好,三七互娱考的是Unity知识点,还有一颗树,好难受,不知道写的代码可不可以运行。

3.1 北京庚图

两道题目,一道代码找错题目,一道编程题(C语言)。
编程题:从输入的字符串中析取出文件路径,文件名,文件后缀。

比如:"C:\book library\This Is Dat.001.txt"
路径名:C:\book library\
文件名:This Is Dat
后缀名:txt

当时太紧张了,以为这路径有蹊跷,不知道Is是属于路径的,还是属于文件的,竟然傻到用空格作为划分字符。
实际上,这里应该从后往前读取,第一个点分割的是文件名与后缀,第一个反斜杠分割的是路径名与文件名。

3.2 华为

三道编程题,奈何自己写代码速度实在是慢,在没有百度的情况下!
第一道:输入 IP地址 IP地址 子网掩码 判断两个IP是不是来自同一个网络
是的话就输出 1 并且输出网络地址,如下:

输入:IP地址1 IP地址2 子网掩码
输出:是否一致 IP1的网络地址

输入:192.168.127.1 192.168.127.2 255.255.255.0
输出:1 192.168.127.0

输入:192.168.127.1 192.168.125.2 255.255.255.0
输出:0 192.168.127.0

我的代码:

#include <iostream>
#include <string>
using namespace std;
//字符串转化为数字
int strint_to_int(string str) {
	int num = 0;
	for (int i = 0; i < str.size(); i++) {
		int temp = pow(10, str.size() - i - 1) * ((int)str[i] - 48);
		num += temp;
	}
	return num;
}
//字符串的分割,根据'.'
string* get_split(string str) {
	string* str_sp = new string[4];
	int index[3], count = 0;
	for (int i = 0; i < str.size(); i++) {
		if (str[i] == '.') {
			index[count++] = i;
		}
	}
	for (int i = 0; i < index[0]; i++)
		str_sp[0] += str[i];
	for (int i = index[0] + 1; i < index[1]; i++)
		str_sp[1] += str[i];
	for (int i = index[1] + 1; i < index[2]; i++)
		str_sp[2] += str[i];
	for (int i = index[2] + 1; i < str.size(); i++)
		str_sp[3] += str[i];
	return str_sp;

}
//获取IP地址中的字符串
int* get_num(string str) {
	int* arr = new int[4];
	string* str_split = get_split(str);
	for (int i = 0; i < 4; i++) {
		arr[i] = strint_to_int(str_split[i]);

	}
	return arr;
}
//打印数组arr
void print_arr(int* arr, int num) {
	for (int i = 0; i < num; i++) {
		cout << arr[i] << ' ';
	}
}
int main() {
	string str1, str2, str3;
	cin >> str1;//读入IP地址1
	cin >> str2;//读入IP地址2
	cin >> str3;//读入子网掩码
	int* arr1 = get_num(str1);
	int* arr2 = get_num(str2);
	int* arr3 = get_num(str3);
	int* result = new int[4];
	int same = 0;
	//判断是否一致
	if ((arr1[0] & arr3[0]) == (arr2[0] & arr3[0]))
		if ((arr1[1] & arr3[1]) == (arr2[1] & arr3[1]))
			if ((arr1[2] & arr3[2]) == (arr2[2] & arr3[2]))
				if ((arr1[3] & arr3[3]) == (arr2[3] & arr3[3]))
					same = 1;
	for (int i = 0; i < 4; i++) {
		result[i] = (arr1[i] & arr3[i]);
	}
	//输出结果
	cout << same << ' ' << result[0] << '.' << result[1] << '.' << result[2] << '.' << result[3];
}

备注:我的代码实在是太原生了,字符串分割的没想起来,string转化为int也没有想起来,只能自己写函数进行转化。最后竟然通过了测试,我也真的是觉得神奇。

题目中原来想要使用的函数s:

字符串分割函数:

//C++中没有提供类似于python,java中那样的对于字符串进行分割的函数,幸好当时没写出来
//只能自己写一个函数,用来进行字符串的分割
vector<string> str_split(string str, char ch) {
	//不知道会匹配到几个
	//返回string* 会不会不太合理
	//这里返回的是vectir类型的变量,比较方便
	vector<string> v_str;
	string temp;
	for (int i = 0; i < str.size(); i++) {
		if (str[i] != ch) {
			temp.push_back(str[i]);
		}else {
			v_str.push_back(temp);
			temp = "";
		}
	}
	if (temp.size() > 0)//如果最后temp中是有元素的,也要压如栈中
		v_str.push_back(temp);
	return v_str;
}

字符转转化为整形:

#include <stdio.h>
int i = atoi("2234");//头文件以及这个函数是可以完成转换的
//可以理解为auto to int

第二道:输入一个只含有0或1的二维矩阵,计算该矩阵的最大子矩阵的面积,其中对于最大子矩阵的定义是方形的,原二维矩阵也是方形的,如下:

矩阵A:
1 1 1 0 0 
1 1 1 0 1
1 1 1 0 0
1 1 0 0 0
1 1 0 0 0

最大子矩阵:
1 1 1
1 1 1
1 1 1

面积:2

我的代码,只通过了80%的测试用例,不知道是为什么????

#include <iostream>
#include <string>
using namespace std;

//检测矩阵中是不是全为1
//给定一个数组,从元素(x,y)处,向右向下开始判断是否为方形
bool mat_one_test(int** m, int x, int y, int d) {
	for (int i = x; i < x + d; i++) {
		for (int j = y; j < y + d; j++) {//直线写的是j<x+d是一处错误
			if (m[i][j] != 1)
				return false;
		}
	}
	return true;
}

int main() {
	int d;
	cin >> d;
	//d = 3;
	char* str = new char[d];
	int** m = new int* [d];
	//int mat[3][3] = { {1,0,0},{1,1,1},{1,0,1} };

	//处理输入,一一赋值到数组里面
	for (int i = 0; i < d; i++) {
		cin >> str;
		m[i] = new int[d];
		for (int j = 0; j < d; j++) {
			m[i][j] = (int)str[j] - 48;
		}
	}
	int sub_m = 0;//子边的长度
	int left, right;//左右下标
	//先找连续边
	//获取边长然后对方形进行检测,判断是否是方形的
	//是否应该用矩阵直接进行对比
	//判断这个矩阵中的元素是否全为1
	for (int i = d; i > 0; i--) {
		for (int j = 0; j <= d - i; j++) {
			for (int k = 0; k <= d - i; k++) {
				if (mat_one_test(m, j, k, i)) {
					if (i > sub_m) {
						sub_m = i;
					}
				}
			}
		}
	}
	cout << sub_m * sub_m << endl;
}

输入和输出,如下:

4
1110
1110
1111
1111
9
//备注:输入的时候先输入边长,然后不带空格输入数组信息,最后一行是得到的结果
//so?为什么不能全部通过测试?

备注:So?为什么会有20%的测试用例,是无法通过测试的

第三道:SJF作业调度问题?最后一道题目剩余的时间很短,还没来得及理解题意,大概是多cpu情况下的SJF调度?
恨自己当时为什么没有复制下来,只想着提交试卷了!!!!!

3.3 三七互娱

问题1

Q:产生死锁的四个条件?
A:

  1. 互斥 【临界资源只能被一个进程使用】
  2. 请求与保持 【进程需要新资源的时候发出请求,并保持已有资源】
  3. 不可剥夺 【不能够剥夺其他进程的资源】
  4. 循环等待 【若干进程首尾相连,循环等待】

问题2:Unity中协程与线程的区别?
Q:进程、线程、协程之间的关系?
A:

  1. 进程拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程由操作系统调度.
  2. 线程拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程亦由操作系统调度(标准线程是的)。
  3. 协程和线程一样共享堆,不共享栈,协程由程序员在协程的代码里显示调度。
  4. 一个进程有一个主线程与多个辅线程,线程之间是平行运行的,在线程中可以开启协程。

Q:线程与协程的区别?
A:

  1. 协程避免了无意义的调度,可以提高性能,因此需要程序员承担起调度责任。
  2. 协程失去了标准线程使用多CPU的能力,只能使用一个CPU,不能并行。
  3. 在一个CPU上多线程交互进行,在多CPU上多线程可以并行。

Q:Unity中的协程?
A:

  1. U3d中协程的执行通过,yield return xxx,将程序挂起。
  2. 协程不是线程,在Update和LateUpdate中执行。

Link:unity 协程原理与线程的区别

问题3:TCP与UDP的异同
Q:TCP?
A:

  1. TCP(Transmission Control Protocol传输控制协议)。
  2. 传输层协议,是一种面向连接的,可靠的,基于字节流的传输通信协议。
  3. 面向连接,即在客户端和服务器之间发送数据之间,必须先建立连接。
  4. 属于传输层,位于应用层和IP层之间,因为应用层需要可靠的连接,但是IP层没有这样的流机制。
  5. 连接需要建立三次握手、四次挥手断开连接。
  6. 传输数据时可靠的。

Q:TCP连接建立:使用三次握手建立连接
A:

  1. 客户端发送请求【寻址请求】
  2. 服务器端收到报文请求,回应客户端【确认请求】
  3. 客户端收到服务端的报文进行回应【连接请求】

Q:TCP终止一个连接——四次握手
A:

  1. 数据验证请求码
  2. 传输结束标记
  3. 确认结束标记
  4. 连接断开标记

Q:UDP?
A:

  1. UDP(User Datagram Protocol用户数据报协议)。
  2. 传输层协议。
  3. 无连接的数据报协议。
  4. 不能提供数据报分组,组装和不能对数据报进行排序。
  5. 主要用于不要求分组顺序到达的传输中,分组传输顺序的检查和排序有应用层完成。
  6. 提供面向事务的简单不可靠传递服务。
  7. UDP协议使用端口分别运行在同一台设备上的多个应用程序。
  8. 功能:为了在给定的主机上能识别多个目的的地址,同时允许多个应用程序在同一台主句上工作并能够独立地进行数据包的发送和接受,设计用户数据报协议UDP。

Q:TCP与UDP的异同?
A:

  1. TCP是面向连接的(在客户端和服务器之间传输数据之前要先建立连接),UDP是无连接的(发送数据之前不需要先建立连接)。
  2. TCP提供可靠的服务(通过TCP传输的数据。无差错,不丢失,不重复,且按序到达);UDP提供面向事务的简单的不可靠的传输。
  3. UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性比较高的通讯或广播通信。随着网速的提高,UDP使用越来越多。
  4. 每一条TCP连接只能是点到点的,UDP支持一对一,一对多和多对多的交互通信。
  5. TCP对系统资源要去比较多,UDP对系统资源要求比较少。
  6. UDP程序结构更加简单。
  7. TCP是流模式,UDP是数据报模式。

【原文地址】:什么是TCP、UDP以及两者的区别
备注:原文中错别字有点多,不影响阅读。

问题4
Q:Unity中函数的执行顺序
A:11-0002 Unity中函数的执行过程

Unity函数的执行过程,都写在了上面的博文中,主要是对Unity官网中的一篇文章进行了翻译,看中文的话,勉强还是能看得懂的。

问题5
Q:Unity渲染管线的顺序?
A:应用程序阶段(CPU控制)、几何阶段(GPU控制)、光栅化阶段(GPU控制)

链接:Unity3D Shader 渲染流程

问题6
Q:OSI七层模型?TCP/IP四层模型
A:OSI 七层模型和TCP/IP模型及对应协议(详解)

上面文章中给出的解释十分的清晰,推荐!

4.个人现状

现在时间:2020年3月30日20:24:45
这篇文章大概是上周写的,已经通过了背景庚图的面试,拿到了offer,但是这家如同无心插柳,明天是华为的面试,技术面试有两轮,顺便还约定了综面,虽然不是特别能搞清楚面试流程,尽力就好!
.
特别紧张,听说有基本软件基础、个人项目、手撕代码,emm,手撕代码这一项,我认为是程序员必要的,但目前自己的能力不是很足,尚且还做不到,开篇就需要百度,比较恶心。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章