不少小伙伴在刷题的过程中会遇到这样的问题:样例中的示例和代码模版中的输入参数为什么不一样?
对于这样的问题,通常可以按照以下几个方向去思考。
仔细读题
力扣提供了完备的代码级输入接口,这意味着力扣为用户屏蔽了底层的 IO 细节,这在带来便利的同时,也同样会带来一些「误会」。
有些题目的输入与常见的输入形式不同,这类题目通常会在题干中对输入进行解释,有些小伙伴读题过快,就有可能忽略掉这些信息。
以 237. 删除链表中的节点为例:
此处的输入是一个链表。一般链表中删除节点的题目,输入会给链表的表头、待删除节点的值或编号,但这题的代码模版却是:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/void deleteNode(struct ListNode* node) {
// 这是 C 语言模版
}代码模版中只有一个指针,这是为什么呢?我们仔细读题,会发现,题目中说:在设计函数时需要注意,你无法访问链表的头节点 head ,只能直接访问要被删除的节点。
仔细读这句话,再结合代码模版,不难发现代码模版中的 node 就是指向待删除结点的指针,因此这里就不需要链表的表头指针和待删除结点的值了。
至于为什么示例输入中仍需要整个链表和待删除结点的值呢?这是因为力扣在后台构造输入参数时会用到这些数据。
语言特性导致的输入不同
不同语言由于语言特性的不同,也会导致输入输出的不同。
比如 54. 螺旋矩阵中:
C++,Java,Python3 的代码模版分别是:
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
// 这是 C++ 的代码模版
}
};class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
// 这是 Java 的代码模版
}
}class Solution: def spiralOrder(self, matrix: List[List[int]]) -> List[int]: # 这是 Python3 的代码模版
可以看到,他们都只有一个输入参数。
而 C 语言的代码模版则是:
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* spiralOrder(int** matrix, int matrixSize, int* matrixColSize, int* returnSize){
// 这是 C 语言的代码模版
}这是因为 C 语言的无法提供动态的二维数组,因此只能使用较繁琐的指针来作为输入参数。而在指针使用过程中,必须提供额外的输入参数才能避免越界的问题,因此 C 语言的代码模版与示例输入有较大差异。
