leetcode top100
Posted 悟
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode top100相关的知识,希望对你有一定的参考价值。
- 坑
- 转换成数字进行运算,最后转换成链表。可能会出现溢出的情况。
因为无论是int还是long类型表达的数字长度是有限的,而链表的长度是可以无限追加的。 - 解释是干扰你的,其实就是依次从低位到高位的进位过程
-
笔试思路
把链表依次填充到数组中,数组容易操作,然后逐位进行加法运算; -
面试思路
使用链表的思路去解决。
-
注意考虑 链表长度不一样的情况,短链表需要一直陪跑,补充0。
只要有一个不为空,则……
while(l1 != null || l2 != null) -
最后一位可能出现进位,需要补1
-
n%10,n/10的玩法
- 扩展
- 队列和栈的常用方法巧记
压栈弹栈,入队拉出队
栈的常用方法:
push:推入,类似于“扑通”声。
pop:弹出,类似于“砰”的一声。
peek:窥视,类似于“皮皮”声。
isEmpty:判断是否为空,类似于“是不是空”的疑问。
队列的常用方法:
offer:入队,类似于“哦菲儿”声。
poll:出队,类似于“咕噜”声。
peek:查看队首元素,类似于“皮皮”声。
isEmpty:判断是否为空,类似于“是不是空”的疑问。
以下是一些将谐音词汇和栈、队列联系起来的方法:
栈的谐音词汇可以联系到“扑通”声和“砰”的一声,这是因为栈的特点是后进先出,类似于一个物体被推入栈中时发出的声音,以及从栈中弹出物体时发出的声音。
队列的谐音词汇可以联系到“哦菲儿”和“咕噜”的声音,这是因为队列的特点是先进先出,类似于一个物体被推入队列中时发出的声音,以及从队列中弹出物体时发出的声音。
栈和队列的 peek 方法可以联系到“皮皮”声,因为这个方法用于查看栈顶或队首的元素,类似于在看一张扑克牌的牌面。
栈和队列的 isEmpty 方法可以联系到“是不是空”的疑问,因为这个方法用于判断栈或队列是否为空。当栈或队列为空时,就可以想象自己在问“是不是空呢?”这样可以更容易地记忆这个方法。
通过将谐音词汇和栈、队列联系起来,可以帮助我们更加轻松地记忆栈和队列的常用方法。
- 遍历链表的方法优化
在 while 循环中使用了 l1.next 和 l2.next,导致最后一个节点没有被处理。另外,在对链表进行遍历时,应该使用 while (node != null) 循环,而不是 do-while 循环。
用while循环来替代do-while循环,这样就不需要判断链表是否为空或者只有一个节点了;
// 遍历链表
while (l1 != null)
l1Stack.push(l1.val);
l1 = l1.next;
- 把队列数据压进链表的方法优化
老代码
ListNode res = new ListNode(queue1.poll());
ListNode pre = res;
while (!queue1.isEmpty())
ListNode next = new ListNode(queue1.poll());
pre.next = next;
pre = next;
gpt:
ListNode dummy = new ListNode(-1);
ListNode cur = dummy;
while (!queue1.isEmpty())
ListNode node = new ListNode(queue1.poll());
cur.next = node;
cur = cur.next;
return dummy.next;
dummy 是一个哑节点,也称作虚拟节点。它是一个不存储任何实际数据的节点,只是作为辅助节点来帮助构建链表。
在链表的头部添加节点时,如果直接添加到头节点之前,则需要对头节点进行特殊处理。而使用 dummy 节点可以避免这种特殊处理,只需要将新节点添加到 dummy 节点的 next 上即可。最后返回 dummy 节点的 next,即整个链表的头节点。
例如,在构建一个单向链表时,可以使用 dummy 节点作为链表的头节点,它不存储任何实际数据,只是作为一个占位符。这样在添加第一个节点时,可以直接将其添加到 dummy 节点的 next 上,而不需要进行特殊处理。
在链表的删除操作中,有时也可以使用 dummy 节点来简化代码逻辑。例如,如果需要删除链表中所有值为 x 的节点,可以使用 dummy 节点作为头节点,并将其 next 指向原链表的头节点。然后遍历整个链表,对于每个节点,如果其值为 x,则将其从链表中删除。最后返回 dummy 节点的 next,即删除 x 节点后的链表头节点。这种方法可以避免对头节点进行特殊处理。
以下代码可以优化的地方有:
可以使用一个循环变量cur来代替pre,这样可以避免多余的赋值操作。
可以在循环中直接使用queue1.poll()方法来获取队列中的元素,而不需要先定义一个next变量。
可以在循环结束后将cur.next置为null,这样可以避免链表中出现多余的节点。
优化后的代码如下:
ListNode res = new ListNode(queue1.poll());
ListNode cur = res;
while (!queue1.isEmpty())
cur.next = new ListNode(queue1.poll());
cur = cur.next;
cur.next = null;
以上是关于leetcode top100的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode - #208 实现 Trie 前缀树(Top 100)
LeetCode Top 100 Liked Questions 75. Sort Colors (Java版; Medium)
LeetCode Top 100 Liked Questions 146. LRU Cache (Java版; Medium)
LeetCode Top 100 Liked Questions 85. Maximal Rectangle (Java版; Hard)