快手测试开发岗面试题,2019秋招,最后通过了

代码题:

**旋转数组:这个在美团一面的时候也遇到过**

假设按照升序排序的数组在预先未知的某个点上进行了旋转。
( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。
请找出其中最小的元素。注意数组中可能存在重复的元素

int findMin(vector<int>& nums) {
        int left = 0, right = nums.size()-1, mid = 0;
        while(left < right){
            mid = (left + right) >> 1;
            if(nums[mid] > nums[right])
                left = mid + 1;
            else if(nums[mid] < nums[left])
                right = mid;
 
            //处理当反转点位于连续重复数字之间时的情况
            else
                right -= 1;
        }
        return nums[left];   
}

假设数组中不存在重复元素

def findMin(self, nums):
        target = nums[0]
        n = len(nums)
        if n == 1: return target
 
        for i in range(1,n):
            if nums[i] < target:
                return nums[i]
        return target

python装饰器

本质是函数,用来装饰其他函数,为其他函数添加附加功能
@语法只是将函数传入装饰器函数
装饰器允许传入参数

a. 函数就是变量
b. 高阶函数
i. 把一个函数当作实参传给另外一个函数,在不修改被装饰函数源代码情况下为其添加功能
ii. 返回值中包含函数名, 不修改函数的调用方式
c. 嵌套函数
 高阶函数+嵌套函数==》装饰器

python多线程

多线程与多进程的区别
 多线程可以共享全局变量,多进程不能
 多线程中,所有子线程的进程号相同,多进程中,不同的子进程进程号不同
 线程共享内存空间;进程的内存是独立的
 同一个进程的线程之间可以直接交流;两个进程想通信,必须通过一个中间代理来实现
 创建新线程很简单; 创建新进程需要对其父进程进行一次克隆
 一个线程可以控制和操作同一进程里的其他线程;但是进程只能操作子进程

多线程的优点
(1)多线程技术使程序的响应速度更快 ,因为用户界面可以在进行其它工作的同时一直处于活动状态;
(2)当前没有进行处理的任务时可以将处理器时间让给其它任务;
(3)占用大量处理时间的任务可以定期将处理器时间让给其它任务;
(4)可以随时停止任务;
(5)可以分别设置各个任务的优先级以优化性能
多线程缺点
1.如果有大量的线程,会影响性能,因为操作系统需要在它们之间切换.
2.更多的线程需要更多的内存空间
3.线程中止需要考虑对程序运行的影响.
4.通常块模型数据是在多个线程间共享的,需要防止线程死锁情况的发生
什么时候用多进程什么时候用多线程
 需要频繁创建销毁的优先用线程
 需要进行大量计算的优先使用线程:大量计算,当然就是要耗费很多CPU,切换频繁了,这种情况下线程是最合适的。这种原则最常见的是图像处理、算法处理
 可能要扩展到多机分布的用进程,多核分布的用线程
用到多线程的主要是需要处理大量的IO操作时或处理的情况需要花大量的时间等等,比如:读写文件、视频图像的采集、处理、显示、保存等;,具体的
(1)耗时或大量占用处理器的任务阻塞用户界面操作;
(2)各个任务必须等待外部资源 (如远程文件或 Internet连接)。
**

Kmeans的过程

问这个算法估计是因为我的项目中提到了
**
主要思想
先随意给定初始的类别中心,然后做聚类,通过迭代,不断调整这些类别中心,直到得到最好的聚类中心为止。
其算法步骤如下:
1、从集合(x1, x2, …, xn)中随机取k个元素,作为k个类别的各自的中心。
2、聚类。分别计算集合中每一个元素到k个类别中心的距离,将这些元素分别划归到距离最小的那一个类别中去,这个过程其实是一个重新聚类的过程。
3、更新类别中心。根据前面聚类的结果,重新计算每一个类别的中心,计算方法是取当前类别中所有元素,然后计算这些元素在每一个维度的平均值。每一个类别中心都重新计算一遍后,就得到了一个新的类别中心组 。
4、重复第2,3步,直到聚类结果不再发生变化,这样得到的类别中心,基本上就是我们最后想要找的类别中心
优缺点
优点:简单,容易理解,运算速度快
缺点:
(1)只能应用于连续型的数据,并且一定要在聚类前需要手工指定要分成几类。
(2)K-Means的初始类别中心是随机选择的,初始类别中心对整个分类结果和计算时间有很大的影响。初始类别中心不好,可能会使算法陷入局部最小值,得到一个次优的分类结果,而得不到全局最优解,另外,初始类别中心不好,也会增加迭代的次数,从而增加分类所用的时间。
(3)对孤立点敏感。如果总体样本集合中存在噪声点,或者孤立点,那么,它必然会影响到最后的结果
合理的确定K值和K个初始类簇中心点对于聚类效果的好坏有很大的影响

如何选择初始类簇中心点
选择批次距离尽可能远的K个点 首先随机选择一个点作为第一个初始类簇中心点,然后选择距离该点最远的那个点作为第二个初始类簇中心点,然后再选择距离前两个点的最近距离最大的点作为第三个初始类簇的中心点,以此类推,直至选出K个初始类簇中心点

K值确定
法1:(轮廓系数)在实际应用中,由于Kmean一般作为数据预处理,或者用于辅助分聚类贴标签。所以k一般不会设置很大。可以通过枚举,令k从2到一个固定值如10,在每个k值上重复运行数次kmeans(避免局部最优解),并计算当前k的平均轮廓系数,最后选取轮廓系数最大的值对应的k作为最终的集群数目

pytorch

这个也是因为项目中用过所以才问的
什么是Pytorch,为什么选择Pytroch?
一个基于Python的科学计算包, 设计目的有两点:
numpy在GPUs实现上的替代品
具有高度灵活性和速度的深度学习研究平台
PyTorch 是一个建立在 Torch 库之上的 Python 包,旨在加速深度学习应用。
PyTorch 提供一种类似 NumPy 的抽象方法来表征张量(或多维数组),它可以利用 GPU 来加速训练
PyTorch - 张量
张量是多维数组。类似于numpy的ndarrays,另外,张量也可以在GPU上使用。PyTorch支持各种类型的张量。
import torch

python第三方的库有哪些

这个在百度面试中也遇到过
NumPy、
matplotlib(绘制数据图的库)、
Scapy(Scapy是一个Python程序,使用户能够发送,嗅探和剖析并伪造网络数据包。此功能允许构建可以探测,扫描或攻击网络的工具)、
scrapy(爬虫的库)

神经网络中的dropout

指在深度学习网络的训练过程中,对于神经网络单元,按照一定的概率将其暂时从网络中丢弃。注意是暂时,对于随机梯度下降来说,由于是随机丢弃,故而每一个mini-batch都在训练不同的网络