1、双指针
1)如何判断传入的链表是否存在环,并且求出环长度、成环点等问题
使用快慢指针,如果成环,快慢指针一定会相遇
2)链表逆置
使用双指针、递归实现链表逆置,并且递归可以实现原地逆置;
3)两个超级大数相加
一个指针指向第一个数组末尾,一个指针指向第二个数组末尾
从后向前遍历
4)计算最长的山脉
左山脚一个指针,右山脚一个指针。左山脚每次走的步长是山峰长度(用left = right实现),有山脚每次走一步
tips:右山脚需要先上山、再下山,如果只有山顶没有山脚,则不能计算山峰长度
class Solution:
def longestMountain(self, A: List[int]) -> int:
# left山脉左山脚,right山脉右山脚
left, long_length = 0, 0
# 遍历山脉左山脚(left < len(A)-2,这是因为山脉的长度至少为 3)
while left < len(A)-2:
# 寻找合适的初始左山脚,没有找到的话,往后走一步
right = left + 1
# 找到左山脚后遍历右山脚
if A[left] < A[right]:
# 先找到山顶(必不可少,不能跟下面合为一步)
while right < len(A)-1 and A[right] < A[right+1]:
right += 1
# if语句用于判断是否存在右山脚,没有右山脚不能计算山脉长度
if right < len(A)-1 and A[right] > A[right+1]:
while right < len(A)-1 and A[right] > A[right+1]:
right +=1
long_length = max(long_length, right- left+1)
left = right
return long_length
2、链表:
1)链表逆置
使用双指针、递归实现链表逆置,并且递归可以实现原地逆置;
2)两个链表是否有相交的点
如果两个链表相交,最后一个节点的肯定相同遍历两个链表保存最后一个节点即可
3)如何判断传入的链表是否存在环,并且求出环长度、成环点等问题
使用快慢指针,如果成环,快慢指针一定会相遇
4)已知一个大小为n的升序数组,找出是否存在出现次数超过n/2的数
5)用队列实现一个栈,及其push、pop、getmin、getmax操纵
使用python的list数据结构,push可以用[x]+self.queue, pop = self.queue.pop(0),
6)用两个栈实现队列
首先需要把 s1
中所有的元素移到 s2
中,接着把新元素压入 s2
。最后把 s2
中所有的元素弹出,再把弹出的元素压入 s1
。
3、字符串:
1)最长无重复子串、最长回文子串
双指针
子串内的字符在原字符串中一定是连续的。因此我们可以将答案看作原字符串的一个滑动窗口,并维护窗口内不能有重复字符,同时更新窗口的最大值。
2)是否是回文字符串、闭合字符串
借助栈进行判断:配对弹出,不配对压栈
3)重构上升下降字符串(驼峰字符串)
木桶原理:构建字符串桶,从头到尾-从尾到头取字符
4)给定一个字符串(只有小写字母)和m步操作,每一步操作可以把相邻两个字符交换位置,问最多执行m步操作后,字符串中最长连续相同字符的长度
5)求两个字符串最长连续公共序列
6)两个超级大数相加
4、进制转换
1)十进制转为二十五进制
2)
5、排序算法
1)快排的时间复杂度?最好最坏情况?
2)堆排序的时间复杂度?建堆的复杂度
6、数学
1)计算两个数x、y的最小公约数、最大公倍数
x*y = 最小公约数*最大公倍数
最小公约数:[x for x in range(1,a+1) if a%x==0 and b%x ==0][-1]
最大公倍数:a*b/[x for x in range(1,a+1) if a%x==0 and b%x ==0][-1])
2)计算