最近在面试,整理一下LeetCode高频题
* 翻转单链表
循环四步走:七句话(2+4+1)。声名两个变量,一个Temp用户存放返回根节点,一个cursor用于存放合并好的节点。然后while root!=None就进行迭代,把下一步放到Temp,然后更新当前node的next。然后更新node和before。
* 二分查找:
while(left <= right),然后key大于mid就left=mid+1,key小于mid就更新right=mid-1,等于则返回。 外面return -left。
记录:无需递归。直接while。注意更新的时候需要加减一。如果不加减一可能会进入死循环。
* 快速排序:
先Partition返回用pivot把数组分成两半,然后quickSort左+1,quickSort右+1。
* 删除单链表倒数第n个节点:
两个游标保持n的距离迭代,当fast到达结尾删除slow处的节点。
* 给一个数组,构建二叉搜索树:(找到一个元素在二叉搜索树中的位置)注:如果插入元素已经存在,不进行插入。
构建二叉搜索树,相当于遍历数组执行插入操作。insetBST(root,x),判断节点值于x的决定怎么插入。
* 判断是否是对称二叉树:
核心isSymmetric(root.left, root.right),然后判断是否为空,不为空值是否相等。
* 股票的最佳买卖时机:
两个变量,一个历史最低点historyMin,一个当前能获得的最大利益MaxProfit,if 当前值-historyMin>MaxProfit,更新MaxProfit。
* 合并两个有序链表**
循环三步走:新建一个节点赋给两个变量,一个用于返回结果,一个用于遍历。当两条链表都不为None,谁小谁添加到before的后面(if里面三步),最后把剩下的,添加到before后。
* 从前序与中序遍历序列构造二叉树
如果前序遍历数组不为None。那么就用前序遍历的第一个值v构造节点,找出值v在中序遍历中的位置,对前序遍历和中序遍历进行切分。分别传入左递归生成左子树,右递归生成右子树。说明:前序遍历:[ 根节点, [左子树的前序遍历结果], [右子树的前序遍历结果] ]。后序遍历:[ [左子树的中序遍历结果], 根节点, [右子树的中序遍历结果] ]。
* 字符串数字相加
一个进位标志位flag。一个结果res。从个位开始遍历,如果不存在就补0。计算每一位然后追加到res中,最后res翻转,再判断flag,决定是否再加一位。说明:数字相加的题型,一定要从低位往高位加。
* 插入区间
三种情况对应三个while:左边(b<左侧)、有交集(a<=右侧)、右侧(a>右侧)先初始化一个结果。左边的直接放入res。 中间有交集的合并成一个在放入res、右边的直接放入res。返回res。
* 二叉树最大深度
当前节点深度为:当前节点为空则depth=0,不为空则depth=1+最大值(MaxDepth(root.left),MaxDepth(root.right)),
* 翻转二叉树
递归调用invertTree(root.left)得到翻转后的结果,然后改变当前node的左右子树指向。记得有方法返回值。
* 翻转单链表II—翻转m~n之间的节点 **
方法一:进行m次遍历,再进行n-m次(删除+插入)操作,把尾部节点放到首位。(需要新建节点用来记录root)
方法二:进行m次遍历,翻转m到n之间的节点,拼接翻转后的nodelist。
* 搜索二维矩阵
其实就是一个递增数组,只不过分成了很多行。直接用二分查找。只不过取值的时候需要整除和余数去取。
* 搜索二维矩阵II
方法一:二分查找。先找到所在的行,在去行里面找有没有。O(lg(n!))
方法二:从左上角开始遍历,如果比target大则往左走,如果比target小则往下走。O(n+m)
* 单链表排序-(归并排序)
找到中间节点+递归sort左sort右+合并两个有序链表。细节:①得到midNode②先排[midNode.next,)③把midNode.next置为IE空④再排[head,midNode]⑤merge两个有序单链表
* 数组中第K个最大元素
用前K个数构建一个小根堆,然后遍历,如果后面的数大于小根堆的root,则替换root,并且重新构建小根堆。直到结尾。
说明:①从非叶子节点 i/2-1开始遍历②左子树2*i+1 右子树2*i+2③adjustHeap里面全是if④取子树值时,需要判断是超过堆大小
* 堆排序
对数组大小为n的数组nums构建一个堆,然后把顶部元素放到末尾。再重新初始化一个n-1的堆,如此循环
* 写一个函数,能求出输入正数n的平方根x,且精度小于e。(即:x^2-e<n<x^2+e)
二分法,设定一个left=0,right=n。while(不满足x^2-e<n<x^2+e) 就一直二分,直到满足,最后返回n。可以用8来举例。
* 判断一个数是否是质数
从2到n,有一个数能整除就return False。(可以遍历到根号n)
会持续更新,打算背下来40道LeetCode应该就够用。
欢迎大家补充!