力扣刷题笔记14:topcode系列(1)
1.反转链表

解题思路:
假设链表为 1→2→3→∅,我们想要把它改成 ∅←1←2←3。在遍历链表时,将当前节点的 指针改为指向前一个节点。由于节点没有引用其前一个节点,因此必须事先存储其前一个节点。在更改引用之前,还需要存储后一个节点。最后返回新的头引用。
具体代码如下

2.无重复的最长子串

解题思路:这道题我是以动态规划的方法来解决的,我用dp[i]表示以i下标截止的字符串中无重复子串的最长长度。所以初始化dp[0]=1,因为截止到第一个元素的无重复最长子串长度肯定为1,我们首先要从第2个字符开始对字符串进行遍历,在这里我用i表示遍历的位置。每次遍历都要将s[i]和该位置(即i)的前dp[i-1]个字符分别比较。如果相等则记录和s[i]相等的字符的下标(用j表示),并且更新dp[i]=i-j。我们最后所需的结果就是是dp数组中的最大值。
具体代码如下:

3.LUR缓存机制

解题思路:
LRU 缓存机制可以通过哈希表辅以双向链表实现,我们用一个哈希表和一个双向链表维护所有在缓存中的键值对。
双向链表按照被使用的顺序存储了这些键值对,靠近头部的键值对是最近使用的,而靠近尾部的键值对是最久未使用的。
哈希表即为普通的哈希映射(HashMap),通过缓存数据的键映射到其在双向链表中的位置。
这样以来,我们首先使用哈希表进行定位,找出缓存项在双向链表中的位置,随后将其移动到双向链表的头部,即可在 O(1的时间内完成 get 或者 put 操作。具体的方法如下:
对于 get 操作,首先判断 key 是否存在:
如果 key 不存在,则返回 -1;
如果 key 存在,则 key 对应的节点是最近被使用的节点。通过哈希表定位到该节点在双向链表中的位置,并将其移动到双向链表的头部,最后返回该节点的值。
对于 put 操作,首先判断 key 是否存在:
如果 key 不存在,使用 key 和 value 创建一个新的节点,在双向链表的头部添加该节点,并将 key 和该节点添加进哈希表中。然后判断双向链表的节点数是否超出容量,如果超出容量,则删除双向链表的尾部节点,并删除哈希表中对应的项;
如果 key 存在,则与 get 操作类似,先通过哈希表定位,再将对应的节点的值更新为 value,并将该节点移到双向链表的头部。
具体代码如下:



未完待续。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
浙公网安备 33010602011771号