引言

因为最近要找实习,行业形势还收紧,压力巨大,所以打算奋起刷题,暂时把剑指Offer第一部分的刷题感想放在这里。本文不给出标准答案,便于根据思路编写代码。(本人是菜鸡,希望有人指正错误,别再给菜狗上压力了)。

09

题目很简洁,使用两个栈实现一个队列,两个方法,一个是向队列尾部添加元素,一个是从队列头部取出元素。

我自己的解答

我自己的方法是一个stack存储数据,另一个stack完全用来辅助,插入时插入进数据队列中,取出时将所有的数据栈中的取出并压入第二个stack中,最后拿到栈底元素,重新将所有的第二个stack中的元素取出并压入第一个stack

我自己的这个方法就是相当于每次都是把整个栈清空了一次并且重新写入,显然是效率非常低的方法

题解

题解首先使用一个stack用来存储所有的数据,加入时直接压栈,取出时首先判断另一个stack是否为空,如果是空的将第一个stack中的所有元素取出并

压入第二个stack中,所以只要是出队列首先检查第二个stack是否还有元素,如果没有,则重新从第一个stack中进行倒序入栈的操作。代码链接)

30

题目也比较简单,实现一个栈,可以在O(1)时间内完成push和pop和min三个函数

我自己的解答

首先可以很容易注意到push和pop是不需要注意的,因为这两个操作本身就是O(1),min因为要求O(1)所以一定需要有一个额外的数据结构存储最小值,考虑到需要在出栈之后保存正确的最小数结果,可以使用另一个栈记录每一个元素在压入时对应的最小值,在元素出栈时压入的最小值也一同出栈即可。

思路与题解一致,不再展示题解的解法

06

题目要求从尾到头打印一个单向链表

我自己的解答

我使用了一个List用来存储顺序的结果,然后使用循环倒序输出

题解

这种题目从正序变为倒序需要直接想到stack

24

题目要求反转一个链表,本题实在是过于简单不描述了,答案的代码略优,可以免去输入为空的特殊情况讨论,直接放答案在这里

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution {
public ListNode reverseList(ListNode head) {
ListNode prev = null;
ListNode curr = head;
while (curr != null) {
ListNode next = curr.next;
curr.next = prev;
prev = curr;
curr = next;
}
return prev;
}
}

作者:LeetCode-Solution
链接:https://leetcode.cn/problems/fan-zhuan-lian-biao-lcof/solution/fan-zhuan-lian-biao-by-leetcode-solution-jvs5/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。