题目
LeetCode 122. Best Time to Buy and Sell Stock II
思路
- 要求尽可能多的完成交易
- 要求不能同时多笔交易
- 所以判断每笔交易能不能赚钱(即 arr[i + 1] - arr[i] > 0), 满足条件则发生交易即可
LeetCode 122. Best Time to Buy and Sell Stock II
LeetCode 14. Longest Common Prefix
LeetCode 876. Middle of the Linked List
刷到这个题的时候, 因为之前做过快慢指针判断链表中是否存在环的问题.
最先想到的解法就是:
因为快指针的速度是慢指针的一倍, 所以当快指针走到尾结点的时候, 慢指针恰好走到中间.
leetcode 350. Intersection of Two Arrays II
开闭原则(Open-Closed Principle, OCP)
对扩展开放, 对修改关闭. 强调用抽象构建框架, 用实现扩展细节.
单一职责原则(Simple Responsebility Principle, SRP)
一个类、接口、方法只做一件事.
假设我们有一个 Class 负责两个职责,一旦发生需求变更,修改其中一个职责的逻辑代码,有可能会导致另一个职责的功能发生故障.
最好的方式给两个职责分别用两个 Class 来实现, 降低类的复杂度,提高类的 可读性,提高系统的可维护性,降低变更引起的风险.
依赖倒置原则(Dependence Inversion Principle, DIP)
设计代码结构时, 高层模块不应该依赖于底层模块, 二者都应该依赖其抽象.
LeetCode 206. Reverse Linked List
链表的问题说简单也简单, 但是手写代码时也挺容易出错的,主要考验对边界问题的处理.
单链表反转我觉得重点在于头节点的后继指针指向null
其次循环中的逻辑就比较简单了:
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
必须在原数组上操作,不能拷贝额外的数组.
尽量减少操作次数.
但是这样得到的数组并不能保证原来顺序.
1 | public static void moveZeroes(int[] nums) { |
实现一个函数, 可以删除单链表中倒数第K个节点.
要求:
如果链表长度为N, 时间复杂度达到O(N),额外空间复杂度达到O(1)
假设让链表从头开始走到尾, 每移动一步就让K值减一,则当链表走到结尾时: