华为一面

我投的是中央软件院编译器部门,面试官是非智能驾驶车的车载操作操作系统部门(每个人限制一个小时)

  • 不直接问你具体知识点,而是对整个知识体系说一下具体了解哪些,看你掌握了哪些并提出一些问题

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);
    }

}
原文地址:https://www.cnblogs.com/zhihaospace/p/12859418.html