系列(一)算法

1、双指针

1)如何判断传入的链表是否存在环,并且求出环长度、成环点等问题

使用快慢指针,如果成环,快慢指针一定会相遇

经典算法题 -- 判断单链表是否成环及寻找成环节点

2)链表逆置

使用双指针、递归实现链表逆置,并且递归可以实现原地逆置;

单链表算法

3)两个超级大数相加

一个指针指向第一个数组末尾,一个指针指向第二个数组末尾

从后向前遍历

4)计算最长的山脉

左山脚一个指针,右山脚一个指针。左山脚每次走的步长是山峰长度(用left = right实现),有山脚每次走一步

tips:右山脚需要先上山、再下山,如果只有山顶没有山脚,则不能计算山峰长度

845. 数组中的最长山脉

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

Push an element in queue

232. 用栈实现队列


3、字符串:

1)最长无重复子串、最长回文子串

双指针

TIMæªå¾20200224210256.png

子串内的字符在原字符串中一定是连续的。因此我们可以将答案看作原字符串的一个滑动窗口,并维护窗口内不能有重复字符,同时更新窗口的最大值。

剑指 Offer 48. 最长不含重复字符的子字符串

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)计算

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值