算法面试总结(持续更新.........)

1.说说贪心算法?(每一步的最优不一定能达到全局最优,如果可以达到需要严格的数学证明)

2.二分查找的lift会加一是因为?(除法是向下取整的,而要是向上取整就需要right+1了而不是left+1)

3.最短描述数,10的最短描述数是3^2+1^2所以是2,求一个数的最短描述数?(从n/2进行更新,n>=2时成立。)

4.a中长度为l的连续字符串在b中出现的次数和?(1.找到字符串的n-l个模式串,分别用kmp进行匹配,在暴力算法上的改进就是每一次都会在字符串上进行回溯的时间复杂为k*n,而KMP使用了模式串的最大前缀和后缀的信息让字符串不进行回溯,而是让模式串进行移动(这个移动是早已经利用最大前缀和后缀计算好的信息!。2.还是找n-1个模式串但是进行哈希,再分别把字符串的长度l子串进行哈希然后进行匹配即可。)

5.n个有序数组的排序使用最小堆来实现?(对n个起始位置元素构建一个最小堆,每次取堆顶元素在进一个元素(必须是上一个堆顶元素的那个列表里的头一个元素)!1.如果是数组形式的话需要存储对应的数组标号,每次pop一个元素但是复杂度为o(n),2.如果是链表形式的话比较好处理指向它的下一个元素即可)

6.数组元素值为0到n长度为n无序,找出未出现的元素?(1.求和然后遍历在减去!2.异或,0到n异或一边再跟数组遍历异或)

7.旋转数组?(1.无重复元素找最小值和无重复元素找目标值,都是先确定左边有序(mid>=R)还是右边有序(mid<R),然后在使用二分查找进行比较!2.有重复元素单独进行处理:arr[L]=arr[m];相等,特殊处理,++L)

8.二叉搜索书转化为有序双向链表?(原先指向左子结点的指针调整为链表中指向前一个结点的指针,原先指向右子结点的指针调整为链表中指向下一个结点的指针。)

9.正方形顺时针旋转90度?(一共需要走n//2层,逐层进行交换元素,每次只能交换4个元素,要注意走圈不能值被覆盖!)

10.寻找两个有序数组合并后的中位数?(中位数首先要分奇数(最中间那个)和偶数(最中间的两个取平均),在这里使用trick

不管是奇数还是偶数都找(m+n+1)/2和(m+n+2)/2取平均即可!

1.时间空间都是0(m+n)直接申请一个m+n的空间类似于两路归并,再求中位数就行。

2.时间o(m+n)/2,利用两个指针分别在数组的开头位置,谁小谁向后移动直到一共移动m/2+n/2次即可。

3. 在两个有序数据进行二分查找 目标是找位置k((m+n+1)/2或者+2的位置)每次判断k/2的位置,如果左数组大于右数组则左数组的前k/2个元素不可能是目标值抛弃掉,如果小于则相反,如果某个数组没有k/2个元素了那么抛弃另一个数组的k/2因为这一定不是目标值,如果k=1则比较两个元素的第一个元素返回小的那个即可!http://www.cnblogs.com/grandyang/p/4465932.html

11.两个字符串求最小修改次数?(用两个字符串的长度分别减去公共子串长度在进行加和。)

12.两个有序数组排序(第一个数组足够大)?(从第一个数组的第一个空元素开始,以此开始进行放入元素即可!最后可以在进行搬移一次来从头开始覆盖!)

13.N层电梯,只能停一层,求爬楼梯层数最少?(1.暴力法,假设在每一层都停,计算各自爬楼梯的层数然后找到最小的即可

2.感觉用到了贪心的思想,假设停在第i层然后第i层的人为N2,第i-1层及其以下的人数为N1,第i+1层及其以上人数为N3,

如果在第i-1层停那么多爬N3+N2,少爬N1,如果在第i+1层停少爬N3,多爬N1+N2,然后如果N1>N3+N2就在i-1层停

如果N3<N1+N2那么就在i+1层停,其他情况在i层停!)

14.判断是否为二叉树?(递归的去做,子问题一样,判断每个节点数量不超过三个即可!)

15.判断是否为完全二叉树?(要想到层次遍历需要每层去遍历(都不用去判别层次的,很容易!)然后去判断,要是节点有左右孩子或者都没有那么就判断后面是否还有节点即可!要是节点有左节点去判断后面是否还有,要是只有右节点那么一定错!)

16.单向有序链表转化为平衡二叉查找树?(利用快慢指针找到中间的节点然后以此为根节点递归的去建立这棵树!)

17.大数相乘?(数据格式是数组形式存储的[9,8]代表98!!!   1.直接模拟乘法即可!  2.将每一位相乘,相加的结果保存到同一个位置,到最后才计算进位。注意需要前面留一个空(太大的数字需要多个空!所以高位一定要放在后面才可!可以进行反转进位再反转回来即可)以防要进位!  3.注意参数合法,数据类型,正负数,小数的处理!)

18.二叉树的节点交换,递归和非递归的优劣分析?(递归不用实现栈使用系统栈但是内存小容易溢出,迭代的话需要自己实现一个栈大小可自己控制不易溢出,效率方面在这个问题上差不多!)

19.三路快排?二路快排?一路快排?(一路快排:双指针i(遍历数据),j(左边为小于p元素,右边到i之间都大于p元素),当i指向元素小于p元素与j后一位元素交换然后j++,i++,当i指向元素大于等于p元素就i++,二路快排:左右指针,先确定右指针要交换的位置小于元素p,然后左指针在确定一个位置大于元素p然后再进行交换,最后再把元素p与左指针进行交换,三路快排:不稳定排序适合p元素重复很多的情况(荷兰国旗问题),确立左右指针和i指针,l(l指向和l前面的元素都小于元素p),r(r指向和r后面的元素都大于e),i(l之后和i之前的元素都等于元素p,i指针遍历每个元素),i指向的元素e大于元素p则r-1和e进行交换r在--,i指向元素e小于元素p则l+1与e交换然后l++,i++还要,i指向元素e等于元素p则i++即可)

20.产生三角形内的随机数?(以一条三角形的边为矩形的长,三角形的高为矩形的另一对平行边的长,让矩形区域生成随机数均匀分布即可,然后如果该点落在三角形区域就接收,没有落在就拒绝!引申一点:圆的随机数也可以这样去做!

猜你喜欢

转载自blog.csdn.net/taka_is_beauty/article/details/89118496