腾讯精选练习50题
leetcode刷题
草莓味的狮子座leo
这个作者很懒,什么都没留下…
展开
-
腾讯CSIG测开一面
驼峰字符串处理定义驼峰字符串:oto,两个相同字符中间存在一个其他字符输入一段字符,消除其中的驼峰字符串,并返回其最长非驼峰字符比如:输入asdsa 输出:asda解题思路:使用栈数据结构,每次元素依次入栈,如果栈中的元素超过2,则判断与当前元素是否有驼峰,有驼峰则删除当前元素,def tuofeng(str): if len(str) <=2: return [] res =[] for i in range(0,len(str)+1):原创 2021-05-20 09:35:57 · 316 阅读 · 0 评论 -
存在重复元素
解题思路1.hash创建一个hash表{ },遍历数组2.判断hash表中是否已存在当前字符,若存在直接返回结果,若不存在,将当前结果加入哈希表中numset={}2. 使用set遍历数组,数字放入set中,如果数字已经存在与set中,直接返回true,如果遍历完数组,则表示没有发现重复元素,返回falsereturn len(nums) != len(set(nums))3. 排序数组从小到大排序,数组的重复元素一定是相邻位置,扫描已排序的数组,判断相邻两个元素是否相.原创 2021-04-23 17:08:29 · 109 阅读 · 0 评论 -
链表相关
对链表进行操作时,一种常用的技巧就是添加一个哑变量,它的next指针指向链表的头节点206.反转链表解题思路1 .双指针迭代2. 递归19.删除链表的倒数第N个节点解题思路两次遍历:第一次从头节点开始对链表遍历,链表长度为L,第二次遍历至L-N+1个节点时,此节点就是我们需要删除的节点双指针21.合并两个有序链表解题思路比较l1和l2的大小,若l1>l2,则新链表的next指向l2,l2=l2.next若某一链表没遍历完,则新链表直接指向此链表24.两两交换链表中的节原创 2021-04-18 19:54:48 · 93 阅读 · 0 评论 -
反转链表
1.迭代算法算法思路改变指针的指向,初始化两个指针,当前节点curr和前继节点prev遍历整个链表:令当前节点的next指向前一个节点prev =curr.next由于节点没有引用前一个节点的值,所以必须实现存储前一个节点值在更改引用之前还需存储后一个节点,最后返回新的引用2. 递归终止条件:直至链表的最后一个节点,该节点就是反转链表后的头节点返回值:当前节点的下一个节点的next指针指向当前节点curr.next.next =curr同时让当前节点的next指针指向nulln.原创 2021-04-18 14:57:12 · 74 阅读 · 0 评论 -
移除链表元素
1.哨兵节点(虚拟节点)如果要删除的节点是中间节点,将prev的next设置为要删除节点的next即可如果要删除的节点位于链表的头部,可通过哨兵节点解决哨兵节点广泛应用于树和链表中,如伪头、伪尾和标记等算法实现初始化一个哨兵节点shead= ListNode(0),且shead.next =head初始化两个指针prev和curr,指向前继节点和当前节点比较当前节点和要删除的节点:若当前节点就是要删除的节点则prev.next=curr.next;否则prev=curr遍历下一.原创 2021-04-18 13:53:06 · 79 阅读 · 0 评论 -
移除元素
1. 解法一这是最初的错误解法:分析思路:首先定义一个额外的动态数组,遍历nums数组元素,将不等于val值的元素,全部拷贝至动态数组中,之后遍历此动态数组,将动态数组的元素全部拷贝回nums数组,拷贝一次,计数变量j+1,拷贝完毕后,返回j,即为新数组的长度但是题目要求0(1)的额外空间,申请一个动态数组不符合要求当我们删除数组中的元素,后面的元素要跟上来,即后面的会不断往前覆盖1.首先定义len获取数组长度,但是数组的长度是变化的,因此遍历的时候不可以用len(nums)作为上界解.原创 2021-04-18 11:33:29 · 62 阅读 · 0 评论 -
删除有序数组中的重复项
解题思路1set集合,数据唯一运行结果:原因:python中的内存管理改为:nums[:] =list(set(nums))set(nums)是无序的,因此最终代码应为nums[:] = list(sorted(set(nums)))双指针解法解题思路:有序数组:重复项应该是相邻元素删除重复元素,就是将不重复的元素移至数组左侧两个指针分别为p和q,比较两者位置元素是否相等如果相等,q后移一位如果不相等,将q位置的元素复制到p+1上,p后移一位,q后移一位返回p+1,即为.原创 2021-04-17 22:21:43 · 238 阅读 · 1 评论 -
两两交换链表的节点
使用递归解答一个关于递归的博客链接终止条件:当链表为空或者只剩下一个元素时返回值:返回给上一层递归的值应该是交换完成后的子链表用head表示原始链表的头节点,新链表的第二个节点,用newHead表示新链表的头节点,原始链表的第二个节点。则原始链表的其余节点的头节点为newHead.next,令head.next = swapPairs(newHead.next)表示将其余节点两两交换,交换后的新头节点head为下一个节点,然后令newHead.next = head,即完成了所有的节点交换,最后.原创 2021-04-17 21:41:07 · 80 阅读 · 0 评论 -
合并K个升序链表
1.分治算法(归并排序)代码实现# Definition for singly-linked list.# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclass Solution: def mergeKLists(self, lists: List[ListNode]) -> ListNode: if not lists.原创 2021-04-17 21:08:04 · 84 阅读 · 0 评论 -
详解递归
1.什么是递归函数在运行时,调用自己 如f(x)=x+f(x−1)def foo(x): return x+foo(x+1)x=2时,返回2+foo(3)调用foo(3)x=3时,返回3+foo(4)调用foo(4)…递归的终止条件:x<50def foo(x): if x<50: return x+foo(x+1) else: return 0递归函数必须有终止条件,否则会无止境,报错递归函数先不断调用本身,直至遇到终止条件然后进行回溯原创 2021-04-17 20:39:27 · 77 阅读 · 0 评论 -
合并两个有序链表
解题思路:因为两个链表都是升序链表,比较L1和L2,若L1>L2,则合成链表node.next为L2;若L1<L2,则合成链表node.next为L1若L1>L2,node.next=L2,L2=L2.next若L1还有数据没有比较完,则直接插入至node.next代码实现class Solution: def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode: res = .原创 2021-04-17 20:25:31 · 73 阅读 · 0 评论 -
有效的括号
1. 栈解题思路:遍历字符串s,左括号依次存入栈中,后遇到的左括号要先闭合,因此将此左括号放入栈顶当我们遇到一个右括号时,需要将一个相同类型的左括号闭合,此时取出栈顶的左括号并判断是否时候同一类型。如果不是相同类型,或者栈中没有左括号,那么字符串s无效,返回false使用hash存储每一种括号,key表示右括号,value为相同类型的左括号遍历结束后,如果栈中没有左括号,说明s中的所有左括号全部闭合,返回true,否则返回false有效字符串长度一定为偶数class Solution:.原创 2021-04-17 12:49:57 · 92 阅读 · 0 评论