1.自我介绍html
2.平时用什么编程语言比较多java
python,另外学过C语言和JAVApython
3.c语言里指针占多少内存c++
答成8位了,应该根据机器而言是16位或32位面试
4.python里的map函数,讲一下它的做用和返回值算法
传入一个函数和一个list,将这个函数做用于这个list的每一个元素上.返回值是一个新的list.编程
5.什么是梯度降低法数组
6.手写代码:归并两个有序数组数据结构
7.知不知道什么数据结构的查找的时间复杂度是O(1)框架
哈希表,也就是python中的dict
8.哈希表的原理是什么
利用哈希函数映射,构造出一个键值对
9.手写代码:两个大文件a和b,每一行存储的都是一个字符串,找出其中在两个文件中都出现过的字符串
构造一个哈希表,先逐行读入文件a,若是该字符串已经在哈希表中就跳过,若是不存在就存入哈希表中.读完之后逐行读入b,查找哈希表中有没有对应的值.
当时用的是dict,面试官说这种状况直接用set会更好.
10.如何判断一个链表中是否是存在环
一开始理解成是头尾相连的环,先回答了设头结点为一个特殊字符,好比'*',而后一直往下读取,若是读到null说明没有环,若是读到'*'说明有.
面试官提示说不必定是和头结点连成环,先回答了相似上面的想法,每一位设一个特殊字符,而后判断.可是须要用一个额外的空间来存储被设为特殊字符的结点原来的值.
面试官问有没有不须要额外空间的方法,思考了一会想到设立两个指针,都从头部开始遍历,一个指针每次前移一位,另外一个指针每次前移两位,若是它们相遇就说明存在环,若是遇到null说明没有环.
面试官问为何这种方法必定可以找到环.由于假设环的长度是K,前一个指针每次都会比后一个指针多走一步,那么让两个指针一直走下去,确定会存在一个M,使得K是M的因数,而且二者在环内相遇.
11.有一个内存放不下的大文件,每一行存储的是一个数字,如今要随机从中取100个数字,怎么取比较好
先想到直接随机取一个数M,而后取M~M+100行的数.面试官说没法肯定文件的大小,那么这个M也没法随机取.
这道题没有想到太好的思路,后来在网上也没有找到相似题的答案.
一面事后一天接到了二面的电话
1.自我介绍
2.知道c++中指针和引用的区别吗
我表示没有学过C++,只学过C
3.一个有序数组,如今将它从某个位置翻转后,如何查找其中的数字
翻转有序数组问题,首先有序联想到了二分查找.而后根据查找的状况修改一下判断条件便可.由于一个翻转有序数组从中间截断后,一定有一边是有序数组,另外一边还是翻转有序数组,那么问题就解决了.
4.一个有序数组,给定一个k,要将它第k位后的数字总体移到前面去,如何实现
先回答了最简单的方法,就是新建一个数组,先存入原数组第k位后的数字,再存入前k位数字.空间复杂度为O(n)
而后又想到一种方法,定义一个操做为翻转,能够经过不停地交换数组两边的元素实现.那么首先翻转数组的前k个数字,再翻转数组第k位后的数字,而后再将数组整个翻转一次就能够了.空间复杂度为O(1)
5.一个n步的台阶,每次能够走1步或2步,走完n步有多少种方法
动态规划问题,f(1)=1,f(2)=2,f(n)=f(n-1)+f(n-2)
6.实现斐波那契数列的时间复杂度是多少
上题的动态规划式子实际上就是斐波那契数列,递归实现的时间复杂度是O(2^n),非递归实现的时间复杂度是O(n)
7.若是有两个单词的组成彻底相同,就称为同源单词.例如stop和post.如今有一个字典,若是找出其中全部的同源单词?
想到了trie树.假设都是小写字母的话,那么就构造一个26叉树表明26个小写字母.在将单词存入树中时,将它拆为按字典序排好的字母,例如stop就是头结点->o->p->s->t,而后将stop存入t结点中.相似的post也会被存在头结点->o->p->s->t结点中.这样遍历一次字典后只须要看树结点中有没有多个单词就能找到所有同源单词了.
面试官问若是一个单词很长的话怎么办,回答能够用哈希表存储每一个字母的出现次数.可是这种方法适合用于判断两个单词是否是同源单词,不适合查找全部同源单词.
网上一种思路是先按字母数量排序,而后再存入字典树,比较快速.
8.k-means的原理
9.k-means是局部最优仍是全局最优,为何
局部最优.缘由我回答的是由于k-means的最终结果和初始点的选取有关,因此不多是全局最优的.
面试官表示应该从凸函数的角度去解释.另外在网上看到一种说法是k-means是贪心算法的一种实现,因此是局部最优.
10.项目经历
11.有2.5亿个数字,要从中找出全部只出现过一次的数字,如何实现
首先利用哈希表将2.5亿个数字划分红1000个小文件.而后对于每一个小文件,采用bitmap的思想.所谓bitmap就是指用位来代替数字,本题数字可能有没出现过,出现过一次,出现过屡次三种状况,因此要用2位来表示一个数字.在完成全部文件的bitmap后,00表示没有出现过,01表示出现过一次,10表示出现过屡次,那么咱们将1000个文件中每组对应的两位bitmap相加,若是一组结果为01就表示对应的数字只出现过一次.
过了一个周末后接到了部门经理的电话,给了口头offer
两天后接到HR电话,商量了入职时间.
又一周后收到了正式offer~