不少小伙伴在刷题的过程中会遇到这样的问题:样例中的示例和代码模版中的输入参数为什么不一样?
对于这样的问题,通常可以按照以下几个方向去思考。
仔细读题
力扣提供了完备的代码级输入接口,这意味着力扣为用户屏蔽了底层的 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 语言的代码模版与示例输入有较大差异。