华为一面
我投的是中央软件院编译器部门,面试官是非智能驾驶车的车载操作操作系统部门(每个人限制一个小时)
-
不直接问你具体知识点,而是对整个知识体系说一下具体了解哪些,看你掌握了哪些并提出一些问题
1.首先自我介绍
2.详细的询问工作内容
3.详细的询问简历中所写的项目
4.询问对C++是否了解
5.自定义的C++内存分配器如何替换原来的内存分配器
6.说一下C++的内存分配器(两级结构和内存池以及STL),内存结构(堆,栈,自由存储区,全局/静态存储区,常量区),虚函数表
7.说一下对操作系统的了解(进程,线程概念和状态转换以及两者优缺点,死锁的四个必要条件,进程调度算法,页面置换算法,页和段,内存抖动,用户态和内核态)
8.说一下对计算机网络的了解(网络的七层结构以及每一层的作用,每一层有哪些协议,还有主要讲讲路由选择协议,三次握手和四次挥手等)
9.说一下对数据结构和算法的了解以及应用场景(排序的众多算法,栈和队列,链表,二叉树,堆,图论的最小生成树,拓扑排序,prime和kruskal,并查集,线段树,字典树等)面试官提问:斐波纳挈堆,红黑树和平衡二叉树详细说一下
10.询问是否熟练掌握Linux,Shell,还会Java,python吗【害怕极了会问一些知识点,当时说的是只是用过不熟悉】
11.看着你的简历问你的技术,例如我写了了解docker,Hadoop,zookeeper等,他问docker与虚拟机区别以及docker使用了那两个与操作系统有关的技术,Hadoop讲一下,zookeeper讲一下
12.询问是否有其他开源项目或阅读过开源项目,是否会用git和svn
13.开始编程:三道题
(1)第一题是主要是原码和补码之间的关系
import java.util.Scanner; public class Test3 { public static char[] c = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; public static void main(String[] args) { Scanner sc = new Scanner(System.in); int i = sc.nextInt(); System.out.println(helper(i)); } public static String helper(int n){ StringBuffer sb = new StringBuffer(); boolean flag = false; if (n == 0){ return "0x0"; }else if(n < 0){ n = Integer.MAX_VALUE + n + 1; flag = true; } while(n > 0){ char t = c[n % 16]; n /= 16; sb.insert(0,t); } if (flag){ sb.replace(0,1,"F"); } return sb.insert(0,"0x").toString(); } }
(2)第二题利用面积(圆点在圆心半径为1的圆以及他的外接正方形,随机N次到其中的概率,则PI=4P)
import java.util.Random; public class Test2 { public static void main(String[] args) { int n = 10000000; int sum = 0; double PI; Random random = new Random(); for (int i = 0; i < n; i++) { double x = random.nextDouble(); double y = random.nextDouble(); sum += (helper(x, y) ? 1 : 0); } PI = 4 * ((double) sum / n); System.out.println(PI); } public static boolean helper(double x, double y) { return Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)) >= 1 ? false : true; } }
(3)第三题一开始想的是用换底公式但是怕不是太简单了,会不会使用泰勒展开式来求则不得而知了
public class Test3 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); System.out.println(helper(2, n)); } public static double helper(int base, int n) { return Math.log(n) / Math.log(base); } }