深度学习试题_深度学习秋招面试题集锦(一)

ce57645536fa7c23636e5f6d8284c657.png

这部分的面试题包含C++基础知识、python基础、概率相关、智力题相关、算法相关以及深度学习相关。后续还会不断补充,欢迎大家查阅!


C++后台开发面试常见问题汇总

Q1 : C++虚函数表剖析。

A1 : CSDN

Q2 : C++中虚析构函数的作用及其原理分析。

A2 : CSDN

Q3 : 结构体(struct)和联合体(union)的区别。

A3 : CSDN

Q4 : Define 和 Const 定义常量的区别。

A4 : CSDN

Q5 : C++ STL。

A5 : CSDN

Q6 : 红黑树概念。

A6 : CSDN

Q7 : 重载与重写的区别。

A7 : CSDN

Q8 : 值传递、指针传递、引用传递详解。

A8 : CSDN

Q9 : 指针与引用的区别。

A9 : CSDN

Q10 : 函数返回时,返回值、返回引用和返回指针的区别。

A10 : CSDN | CSDN

Q11 : 虚函数能否是内联的?

A11 : CSDN | CSDN

Q12 : vector和list的区别。

A12 : CSDN

Q13 : C++中的export关键字解释。

A13 : CSDN

Q14 : 私有构造函数的作用。

A14 : CSDN

Q15 : 什么场景下会用到友元函数?

A15 : CSDN

Q16 : 虚函数和纯虚函数的区别?

A16 : CSDN

Q17 : C++内存分配方式详解。

A17 : CSDN


Q1 : Python字典的核心底层原理。

A1 : Python字典的核心底层原理讲解

Q2 : __new__()__init__()区别。

A2 : CSDN

Q3 : Python中排序函数sort()和sorted()的区别。

A3 : CSDN

Q4 : 引用、可变类型和不可变类型、深拷贝和浅拷贝。

A4 :

引用、可变类型和不可变类型、深拷贝和浅拷贝_斯瑞德想要进步-CSDN博客​blog.csdn.net
6c41a8190abe91978c068a492d9817a8.png

Q5 : Python的位置参数、默认参数、关键字参数、可变参数区别。

A5 :

python的位置参数、默认参数、关键字参数、可变参数区别 - bigdata_devops - 开发者的网上家园​www.cnblogs.com

Q1 : 利用牛顿迭代法自己写平方根函数sqrt。

A1 : CSDN

Q2 : 二阶优化方法。

A2 : CSDN | CSDN

Q3 : 快排算法及其优化。

A3: CSDN

Q4 : 二叉树的前序遍历。

A4 : zhihu

Q5 : 最长子序列。

A5 : zhihu | CSDN

Q6 : 翻转二叉树。

A6 : zhihu

Q7 : 算法与数据结构中的位运算。

A7 : zhihu

Q8 : 贪心问题(小船过河)。

A8 : CSDN

Q9 : 最长回文子串 & 最长回文子序列(动态规划)。

A9 : CSDN

Q10 : 大数相减(依图祖传题)。

A10 : CSDN

Q11 : 计算从二维数组的左上角到达右下角的所有路径数及最短的那条,如果存在障碍物时又是多少。

A11 : CSDN | 走到(m,n)位置需要m+n-2步,从中选择n-1步向右走,就是组合数

Q12 : 编辑距离及编辑距离算法(动态规划)。

A12 : CSDN

Q13 : 海量数据。

A13 : CSDN

Q14 : 找出未知长度的链表的中间的元素。

A14 : 设置两个指针,p1,p2, 开始p1,p2均位于链表的头部。p1每次前进两步,p2每次前进一步;当p1到达链表的末尾时,p2所在的位置就是链表的中间元素。

Q15 : 删除有序链表中的重复结点。

A15 : CSDN

Q16 : 求数组中出现次数超过数组长度一半的元素。

A16 : CSDN

Q17 : 用1*3的瓷砖密铺3*20的地板有几种方式?(1278)

A17 : 牛客网

Q18 : 顺时针打印矩阵。

A18 : CSDN

Q19 : 字符串循环左移。

A19 : CSDN

Q20 : 给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?

A20 : CSDN

Q21 : 有序数组去重。

A21 : CSDN

Q22 : 子数组的最大累加和。

A22 : CSDN

Q23 : 不借助第三个变量交换a,b两个变量值。

A23 :

Q24 : 几种常用排序算法的对比。

A24 : CSDN

Q25 : 42亿QQ,O(1)时间复杂度完成查找。

A25 : CSDN

Q26 : 有排成一行的n个方格,用红(Red)、粉(Pink)、绿(Green)三色涂每个格子,每格涂一色,要求任何相邻的方格不能同色,且首尾两格也不同色.求全部的满足要求的涂法。

A26 : 考虑第n-1个格子:

  1. 如果这个格子和第1个格子颜色不同,那么第n个格子只有1种选择,前n-1个格子的选择就是A(n-1),此时n个格子的选择是1*A(n-1)
  2. 如果这个格子和第1个格子颜色相同,那么第n个格子只有2种选择,前n-2个格子的选择就是A(n-2),此时n个格子的选择时2*A(n-2)

所以有A(n)=2*A(n-2)+A(n-1), n>=4

remak: 因为我们是考虑第n-1个格子,该格子和第1个格子的颜色可能相同也可能不同,所以n>=4才可以。不然n=3的话,第n-1=3-1=2个格子和第一个格子的颜色必然不同了,就没有上面这2种情况了,所以要从n>=4开始推导。

M 表示色的种数,F(n)是方案数

F(n)=(m-2)(F(n)-1)+(m-1)(F(n)-2)
A(1) = 3

A(2) = 6 //A(3,2)=6

A(3) = 6 //A(3,3)=6

A(n)= A(n-1)+ 2*A(n-2), n>=4

Q27 : 给定整数n和m, 将1到n的这n个整数按字典序排列之后, 求其中的第m个数。

A27 :

既然是字典序,那么很自然,我们可以考虑使用字典树来实现。但是,这里并不需要真的生成这个字典树,而只需要计算对应分支的节点数就行了。计算分支节点数,那么很简单,节点数就是上级节点*10,总的节点数= 1 + (1 * 10) + (1 * 10 * 10) + (1 * 10 * 10 * 10) + ... 。

既然知道了如何计算字典树分支的节点数,要想知道第m个数是什么,那么也就是找第m个节点,首先从1开始,如果1分支的节点数>m,那么第m个数肯定是以1开头,进一步搜索其子节点,搜索子节点时不用再搜索1了,所以是搜索1分支的第m-1个节点。如果1分支的节点数<m, 那么所查找的数肯定不是1开头,那么开始搜索2分支,在2分支中,所要找的数应该是第(m-(1分支节点数))个数。重复这个过程,要么搜索子节点,要么搜索兄弟节点,直到最终m==0,也就是当前节点就是所要搜索的节点。

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            long n = sc.nextLong();
            long m = sc.nextLong();
            System.out.println(solve(n, m));
        }
    }

    private static long solve(long n, long m) {
        long ans = 1;
        while (m != 0) {
            long cnt = getCntOfPre(ans, n);
            if(cnt >= m) {
                m --;
                if(m == 0)
                    break;
                ans *= 10;
            } else {
                m -= cnt;
                ans ++;
            }
        }
        return ans;
    }
    // 计算以pre为开头并且小于n的数字的个数
    private static long getCntOfPre(long pre, long n) {
        long cnt = 1;
        long p = 10;
        for (; pre * p <= n; p *= 10) {
            if (pre * p - 1 + p < n)
                cnt += p;
            else
                cnt += n - pre * p + 1;
        }
        return cnt;
    }
}

Q28 : 如何判断一个树是否是平衡二叉树。

A28 :

如何判断一个树是否是平衡二叉树_小熊不哭站起来撸-CSDN博客​blog.csdn.net
6c41a8190abe91978c068a492d9817a8.png

Q29 : 如何判断一个树是否是完全二叉树。

A29 :

数据结构之判断一棵树是否为完全二叉树_HuangQinJian-CSDN博客​blog.csdn.net
793a4566ccb83da20fdfc359fe319d94.png

Q1 : 用10只小白鼠查找1000瓶药中有毒的那一瓶(只有一瓶)。

A1 : CSDN

Q2 : 卡特兰数。

A2 : 佚名

Q3 : 圆上任取三点构成锐角三角形概率。(1/4)

A3 : 佚名

Q4 : 有两根不均匀的香,烧完一根需要一个小时,如何用两根香来确定一段15分钟的时间?

A4 : 把第一根香两头点燃,同时第二根香的一头点燃,当第一根香烧完的时候是过了半小时,此时把第二根的另一头点燃,从第一根烧完到第二根烧完之间的这段时间是15分钟。

Q5 : 10瓶药,每瓶药都有10颗,其中有一瓶是坏的,质量比正常的多0.1g,如何一次性称出坏的药。

A5 : 分别从1-10号瓶中取1到10颗集中在一起称,看比正常重多少克。

Q6 : 一个房间里面有三盏灯,外面有三个开关,只进去一次怎么确定哪个开关对应哪盏灯。

A6 : 一个开关打开一段时间后关闭,然后打开另一个开关,去房间,摸一下,有温度的是第一个打开的,亮的第二次打开的,另一个灯也就能判断了。

Q7 : 50个红球和50个蓝球,放入两个箱子,怎么样放置才能使拿到红球的概率最大?

A7 : 一个箱子放1个红球,另一个放49个红球和50个蓝球 拿到红球概率=0.5+0.5*(49/99)约等于0.75。

Q8 : 一根木棍截成三段,组成三角形的概率是多少?(1/4)

A8 : 佚名

Q9 : 给一个瞎子52张扑克牌,并告诉他里面恰好有10张牌是正面朝上的.要求这个瞎子把牌分成两堆,使得每堆牌里正面朝上的牌的张数一样多。

A9 : 把扑克牌分成两堆,一堆10张,一堆42张。然后,把小的那一堆里的所有牌全部翻过来。(假设10张中,全部正面朝上,42张中就没有向上的,那么将10张向上的一翻,就变成两边都没有一张向上。若10张中9张向上,42张中则只有1张向上的,那么将10张向上的一翻,就变成两边都各有一张向上,以此类推。)

Q10 : 有 n 份数据,但是 n 的长度并不知道,设计一个采样算法,使得每份被选择的概率是相同的。

A10 : 一开始选择第一个数据作为候选数据,以概率1/2拿第二个数据替换当前候选,以1/3选择拿三个数据替换当前候选,依次类推。这样,第x个数据为最终选择的数据的概率 = x被选择的概率 * (x+1没被选择的概率) * (x+2没有被选择的概率) ...(n没有被选择的概率)。举个例子,第2个数据被选择的概率为:1/2 *(2/3 * 3/4 * 4/5 .... n-1/n) = 1 / n。

Q11 : n个 [0,n) 的数,求每个数的出现次数(不能开辟额外空间)。

A11 : 这里关键是看清楚题意,n个数,然后是左闭右开的区间,也就是说每个数都不会大于等于n,那么思路主要有以下两点: 1)如果我们给一个索引下的数不管加上多少个n,那么这个数对n取余的话,我们就能知道这个数原来是多少; 2)另一方面,如果一个数出现一次,我们就在对应索引位置下的数加上n,那么每个数对应索引位置上的数对n取商的话,就是这个数出现的次数。这样就做到了没有开辟额外的空间。

public class timeDemo {
    public static void main(String[] args){
        int[] arr = {0,1,3,4,3,2,5,4,3,7,3,2,4,6};
        int n = 8;
        for(int i = 0;i<arr.length;i++){
            arr[arr[i] % n] += n;
        }
        for(int i = 0;i<n;i++){
            System.out.println(i + ":" + arr[i] / n);
        }
    }
}

Q12 : 已知有个rand7()的函数,返回1到7随机自然数,怎样利用这个rand7()构造rand10(),随机1~10。

A12 : 产生随机数的主要原则是每个数出现的概率是相等的,如果可以得到一组等概率出现的数字,那么就可以从中找到映射为1~10的方法。

rand7()返回1~7的自然数,构造新的函数 (rand7()-1)*7 + rand7(),这个函数会随机产生1-49的自然数。原因是1-49中的每个数只有唯一的第一个rand7()的值和第二个rand7()的值表示,于是它们出现的概率是相等,均为1/49。

但是这里的数字太多,可以丢弃41-49的数字,把1-40的数字分成10组,每组映射成1-10中的一个,于是可以得到随机的结果。

具体方法是,利用(rand7()-1)*7 + rand7()产生随机数x,如果大于40则继续随机直到小于等于40为止,如果小于等于40,则产生的随机数为(x-1)/4+1。

Q13 : 有一对夫妇,先后生了两个孩子,其中一个孩子是女孩,问另一个孩子是男孩的概率是多大?(2/3)

A13 : 两个孩子的性别有以下四种可能:(男男)(男女)(女男)(女女),其中一个是女孩,就排除了(男男),还剩三种情况。其中另一个是男孩的占了两种,所以答案是2/3。之所以答案不是1/2,是因为女孩到底是第一个生的还是第二个生的是不确定的。

Q14 : 12个硬币,其中有一个质量不一样,给你一个天平最少几次能把哪个硬币找出来,怎么称?(三次)

A14 : 假设假币比真币重,把12个硬币分成两份,每份6个,用天平称第一次,重的留下;再分成两份,每边3个,称第二次,重的那边再留下。这样就只有3个硬币了,假的在里面。任选2个拿出来称第三次,如果重量相等,则剩下的是假币,如重量不相等,则重的是假币。

Q15 : 有9个硬币,其中一个的重量与其它的不同,那么请问她用天平最少称几次才能找到。(三次)

A15 : 平均分成三份,其中两份放在天平两端。

(1)一样重:可推断其余3个必有1个不一样重的。将这三个其中两个放在天平两端,若平衡,则剩下一个是不一样的; 若不平衡,其中必有一个是假的,取下一个换另一个,若平衡则取下的那个是假的;若不平衡则原来留在手上的一个是假的。

(2)不一样重:这时记住轻重情况另外三个一定是真的,用另外三个换下天平一端的三个。 若平衡,则取下的三个有一个是假的;再将取出的三个中的两个放在天平两侧,若平衡则剩下的一个是假的;若不平衡从轻重上判定。

所以至少称3次才能找到。


几何分布:

  • 做某事件的次数(也叫试验次数)是固定的,用n表示。(例如,抛硬币3次,求婚101次)
  • 每一次事件都有两个可能的结果(成功,或者失败)。(例如,求婚被接受(成功),求婚被拒绝(失败))
  • 每一次“成功”的概率都是相等的,成功的概率用p表示。
  • 这一点也即和二项分布的区别所在,二项分布求解的问题是成功x次的概率。而几何分布求解的问题则变成了试验x次,才取得第一次成功的概率。

几何分布发生的概率:

,期望:

超几何分布:

产品抽样检查中经常遇到一类实际问题,假定在N件产品中有M件不合格品,在产品中随机抽n件做检查,发现k件不合格品的概率为:

  • 超几何分布和二项分布的区别: 超几何分布需要知道总体的容量,而二项分布不需要;
  • 超几何分布是不放回抽取,而二项分布是放回抽取(独立重复) 当总体的容量非常大时,超几何分布近似于二项分布。

伯努利分布:

伯努利分布(Bernoulli distribution)又名两点分布或0-1分布。伯努利分布是离散型概率分布,其概率密度函数为:

二项分布:

二项分布(Binomial distribution)是n重伯努利试验成功次数的离散概率分布。

期望:

,方差:

几个常用的计算两个概率分布之间距离的方法以及python实现

CSDN

矩阵范数

矩阵 1 范数:矩阵的每一列上的元素绝对值先求和,再从中取个最大的(列和最大)

矩阵 2 范数:矩阵

的最大特征值开平方根

矩阵无穷范数:矩阵的每一行上的元素绝对值先求和,再从中取个最大的(行和最大)


Q1 : bagging vs boosting vs 随机森林 vs GBDT。

A1 : CSDN

Q2 : 解决局部最优点问题的方案。

A2 :

  • 使用随机梯度下降代替真正的梯度下降。可以这样理解,每次针对单个数据样例进行摸索前进时,本质上是在一个样例形成的误差曲面上摸索前进,而每个样例的曲面大体类似,又不尽相同,当你掉入一个坑里时,往往能被别的曲面拽出来。
  • 设置冲量。人如其名,本次前进的步伐,根据上一次的步伐,适当调大,好比从高处降落的石头,会更有机率跨过一些小坑,如果坑非常大,依靠冲量的惯性是没法逃出的。
  • 不同的初始权值进行训练。假定误差曲面是个坑坑洼洼的曲面,我们尝试第一次降落到随机的起点,然后再开始摸索前进,也许会有运气好的一次,能够不落在某个小坑附近,多次尝试权重,可能会找到好的全局点。

Q1 : Smooth l1 loss和l2有什么区别?

A1 : 尹相楠的回答 | 落点点的回答

Q2 : Faster RCNN?

A2 : 白裳的文章

Q3 : 优化方法总结(BGD,SGD,Momentum,AdaGrad,RMSProp,Adam)

A3 : CSDN

Q4 : 模型的性能评估标准

A4 : 掘金

Q5 : 深度学习中 number of training epochs 中的 epoch到底指什么?

A5 :

(1)iteration:表示1次迭代(也叫training step),每次迭代更新1次网络结构的参数;

(2)batch-size:1次迭代所使用的样本量;

(3)epoch:1个epoch表示过了1遍训练集中的所有样本。

值得注意的是,在深度学习领域中,常用带mini-batch的随机梯度下降算法训练深层结构,它有一个好处就是并不需要遍历全部的样本,当数据量非常大时十分有效。此时,可根据实际问题来定义epoch,例如定义10000次迭代为1个epoch,若每次迭代的batch-size设为256,那么1个epoch相当于过了2560000个训练样本。

Michael Yuan

Q6 : 在神经网络中,激活函数sigmoid和tanh除了阈值取值外有什么不同吗?

A6 : Daniel的回答

Q7 : Batch Normalization原理及其好处?

A7 : Juliuszh的文章 | 天雨粟的文章

Q8 : YOLO v1~v3理解?

A8 : YOLO v1深入理解 | YOLO v3深入理解

Q9 : Group Normalization?

A9 : CSDN | DoubleV的文章 | Eminem1147的文章

Q10 : Inception-v1~v4理解?

A10 : 我是小将的文章 | BLOG

Q11 : RoIPooling、RoIAlign有什么不同吗?

A11 : CSDN

Q12 : Mask RCNN原理?

A12 : stone的文章

Q13 : 卷积神经网络(CNN)反向传播算法原理?

A13 : BLOG

Q14 : 鞍点解释?

A14 : 夕小瑶的卖萌屋

Q15 : Softmax求导?

A15 : CSDN

Q16 : 神经网络中的各种优化方法?

A16 : CSDN

Q17 : FPN详解。

A17 : CSDN

Q18 : SVM详解。

A18 : CSDN

Q19 : LR为什么取log损失函数,又为什么在似然函数计算之后取对数。

A19 :

(1)损失函数的本质就是,如果我们预测对了,能够不惩罚,如果预测错误,会导致损失函数变得很大,也就是惩罚较大,而-log函数在[-1,1]之间正好符合这一点,另外还有一点需要说明,LR是一种广义的线性回归模型,平方损失函数的话,对于Sigmoid函数求导计算,无法保证是凸函数,在优化的过程中,求得的解有可能是局部最小,不是全局的最优值。其二:取完对数之后,对我们的后续求导比较方便。

(2)如果根据似然函数直接计算,有两点缺点:(1)不利于后续的求导,(2)似然函数的计算会导致下溢出。(最后计算的是相乘的结果,而每个计算之后的值都很小,样本如果很多的情况下,就导致下溢出了。比如 0.01 x 0.01 x 0.01...)

具体推导过程:CSDN

Q20 : LR中的共线性问题和解决方法。

A20 : CSDN

Q21 : LR与SVM异同。

A21 : CSDN

Q22 : SVM的数学基础。

A22 : CSDN

Q23 : 卷积神经网络(CNN)公式推导。

A23 : campoo

Q24 : IOU计算代码。

A24 : Reference

Q25 : Faster RCNN细节。

A25 : BLOG

Q26 : 如何理解空洞卷积(dilated convolution)。

A26 : zhihu

Q27 : 如何理解深度学习中的deconvolution networks。

A27 : zhihu

Q28 : YOLOv2、v3使用K-means聚类计算anchor boxes的具体方法。

A28 : CSDN

Q29 : L1和L2正则化目的是什么,什么含义。

A29 : zhihu

Q30 : KL散度与交叉熵的关系。

A30 : zhihu

Q31 : CNN感受野大小计算。

A31 : CSDN

Q32 : Pytorch中nn.Module、nn.functional的区别。

A32 :

大部分nn中的层class都有nn.function对应,其区别是:

  1. nn.Module实现的layer是由class Layer(nn.Module)定义的特殊类,会自动提取可学习参数nn.Parameter。
  2. nn.functional中的函数更像是纯函数,由def function(input)定义。

由于两者性能差异不大,所以具体使用取决于个人喜好。对于激活函数和池化层,由于没有可学习参数,一般使用nn.functional完成,其他的有学习参数的部分则使用类。但是Droupout由于在训练和测试时操作不同,所以建议使用nn.Module实现,它能够通过model.eval加以区分。

Q33 : 卷积神经网络参数量和计算量的计算。

A33 :

卷积神经网络参数量和计算量的计算_Lavi的专栏-CSDN博客​blog.csdn.net
dc5ee7a73b2124f8a9836ce17547aa7d.png
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值