旷视科技笔试总结~

原本以为自己应聘的是Java岗位,笔试的内容跟别的研发岗位会有所区别,然而,却不是这样的,旷视科技对于研发岗位的笔试都是同一份笔试题,但是相比较来看,还是偏向c++方面,我简单总结这份笔试的卷子,在这里只给出部分题目及解析。

一、填空题

1、考虑下面的递归表达式:T\left ( n \right )=T\left ( \sqrt{n} \right )+\theta \left ( loglogn \right ),那么T\left ( n \right )=?

2、对于一个含有n个元素的无序数组,构建一个大顶堆,该操作的时间复杂度为?

3、在32位的机器中,假设在地址0x100位置存储了一个int值为100,那么在0x103地址里面存的字节值用十进制表示是?

4、三种不同的图书单价为10元、15元、20元,某学校计划恰好用500元购买上述图书30本,那么不同的购书方案有?种

二、不定项选择题

1、盒子A 有2个红球和3个篮球,盒子B有3个红球和1个篮球,按照以下方式选择一个球:1>选择一个盒子,选择盒子A和盒子B的概率分别是1/3和2/3;2>从上一步选的盒子里选择一个球,该盒子里所有的球被选择的概率是相等的。

如果最后选出的球是红球,那它是从盒子A中选出来的概率是?

2、二叉树的中序和先序遍历分别是d b e a f c g和a b d e c f g,那么它的后序遍历是?

先序就是 根左右、中序就是 左根右
所以先序的第一个a一定为根节点,则根据a将 中序的分为左右两部分 dbe fcg
则先序也分为两部分 bde cfg 则b是左子树的根节点 c是右节点的根 再遵循上面的步骤就可以画出树了。
后序 是 左右根 最后结果为:dbegcfa

解析:

1)、先序遍历的第一个节点肯定是根节点,所以a为该二叉树的根节点。

2)、中序遍历中根节点左侧的节点全是根节点左子树的节点,根节点右侧的节点全是根节点的右子树。所以我们可以分成 dbe(左) | A(根) | fcg(右)。

3)、递归使用上述两个步骤,可以画出整个二叉树。

1>.先得出a是根节点;

2>.dbe是a左子树的根结点,fcg是a右子树的根节点;

3>.e是a左子树的根节点,f是a右子树的根节点;

4>.db是e左子树中的点,cg是f右子树中的点;

5>.d是e左子树的根节点,c是f右子树的根节点;

6>.b是d左子树的点,g是c右子树中的点。

画图如下:

旷视科技笔试总结~_第1张图片

3、关于c语言中的float,下面说法正确的是?

A、x^2>=0对于float变量x总是成立的   B、float变量加法满足交换律

C、条件0.9f==0.9的值为真      D、条件9==0.9*10的值为真

4、与用于将虚拟地址转换为物理地址的单级页表相比,多级页表更好是因为?

A、它减少了读取和写入内存的访问时间   B、它有助于减少实现进程的虚拟地址空间所需的页表的大小

C、它是翻译后备缓冲区所必需的   D、它有助于减少页面替换算法中的页面错误数量

5、合并排序相对于快速排序的优点不包括?

A、是稳定的   B、最坏的情况更高效  C、空间复杂度低   D、不会退化【快排会退化成为冒泡排序】

合并排序是稳定的,而快速排序不是稳定的。

合并排序和快速排序是典型的分治算法,其时间复杂度的平均性能均为nlgn。合并排序的最坏时间复杂度也能保持nlgn,而快速排序的最坏时间复杂度却为n*n

合并排序是拆分容易,合并困难,而快速排序则是拆分困难,合并容易。

归并排序的空间复杂度为什么是O(n),快速排序的空间复杂度为什么是O(log2n)。

6、在TCP/IP协议模型中,下列常用的协议哪一个属于网络层?

A、TCP                     B、DHCP                   C、ICMP                                  D、HTTP

在TCP/IP协议模型中,网络层常用的协议有:IP、IMCP、ARP、RARP

7、在下列操作系统给进程分配的资源中,哪些是不在进程内部的线程间共享的?(多选)

A、堆                                   B、栈                                  C、寄存器                                                      D、代码段

线程共享的环境包括:

  1>.进程代码段 

  2>.进程的公有数据(利用这些共享的数据,线程很容易的实现相互之间的通讯) 

  3>.进程打开的文件描述符、信号的处理器、进程的当前目录和进程用户ID与进程组ID。

每个线程有自己的堆栈和程序计数器为其执行上下文。

8、c++中,关于new运算符的错误描述是?(多选)

A、运算符new可以用来动态创建对象的对象数组   B、使用运算符new创建对象时,会调用类的构造函数

C、使用new运算符创建的对象使用完了之后会自动销毁并回收 D、使用运算符new创建对象数组时必须定义初始值

9、在intel CPU上,以下线程对int型变量x的操作,哪几个不是原子操作,假设变量的地址都是对齐的?

A、x=y                                  B、x++                                                  C、++x                                                   D、x=1

x=y包含两个操作:读取y至寄存器,再把该值写入x。读y的值这个操作本身是原子的,把值写入x也是原子的,但是两者合起来是不是原子操作呢?x=y不是原子操作,因为它不是不可再分的操作。

10、在当下流行的分布式数据处理平台spark中,有一些常用的高阶算子,比如说flatMap、filter、groupByKey等等,它们中的某些算子会触发shuffle操作,所谓shuffle,粗略的可以理解为要处理的数据集的内部分区需要进行重排,请问下面哪个算子会引起shuffle?(多选)

A、map   B、count     C、sortByKey     D、join

三、算法附加题

1、给定一颗二叉树,返回其右视图列表:即从二叉树右侧看过去,从上到下每层看到的最右边的值的数组,需要实现的函数头如下:

vector   rightView(TreeNode *root);

TreeNode定义如下:

class TreeNode{

                TreeNode *left,*right;

                int val;

};

Input:[5,6,9,null,null,7,8](层次遍历表示法)

OutPut:[5,9,8]

//层序遍历  找到最右边
	public List rightSideView(TreeNode root) {
		List res=new ArrayList<>();
		if (root==null) return res;
		Queue queue=new LinkedList<>();
		queue.add(root);
		while (!queue.isEmpty()) {
			int size=queue.size();
			for (int i = 0; i < size; i++) {
			   TreeNode cur=queue.poll();
			   if (i==size-1)  res.add(cur.val); //把最右边的加进去
			   if (cur.left!=null) 
				   queue.add(cur.left);
			   if (cur.right!=null) 
				   queue.add(cur.right);
			}
		}
		return res;       
   
}

2、给定一个非负整数组,给出乘积和小于K的子串数目。

Input:[1,2,3,4]

       K=10

OutPut:11

The subsequences are{1},{2},{3},{4},{1,2},{1,3},{1,4},{2,3},{2,4},{1,2,3},{1,2,4}

 

Input:[4,8,7,2]

       K=50

OutPut:9

public int numSubarrayProductLessThanK(int[] nums, int k) {
        if (k == 0) return 0;
        int mul = nums[0], left = 0;
        int res = mul < k ? 1 : 0;
        for (int i = 1; i < nums.length; i++) {
            mul *= nums[i];
            while (mul >= k && left <= i) mul /= nums[left++];
            res += i - left + 1;
        }
        return res;
    }

 

你可能感兴趣的:(旷视科技笔试总结~)