为什么示例输入和代码模版不一致?

力扣支持团队发表于:2022年04月02日 中午 12:50:06更新于:2022年04月27日 早上 09:28:40

不少小伙伴在刷题的过程中会遇到这样的问题:样例中的示例和代码模版中的输入参数为什么不一样?

对于这样的问题,通常可以按照以下几个方向去思考。


仔细读题

力扣提供了完备的代码级输入接口,这意味着力扣为用户屏蔽了底层的 IO 细节,这在带来便利的同时,也同样会带来一些「误会」。

有些题目的输入与常见的输入形式不同,这类题目通常会在题干中对输入进行解释,有些小伙伴读题过快,就有可能忽略掉这些信息。

237. 删除链表中的节点为例:

0016253a78198b16cf66efc46d05d9f

此处的输入是一个链表。一般链表中删除节点的题目,输入会给链表的表头、待删除节点的值或编号,但这题的代码模版却是:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */void deleteNode(struct ListNode* node) {
     // 这是 C 语言模版
}

代码模版中只有一个指针,这是为什么呢?我们仔细读题,会发现,题目中说:在设计函数时需要注意,你无法访问链表的头节点 head ,只能直接访问要被删除的节点。

仔细读这句话,再结合代码模版,不难发现代码模版中的 node 就是指向待删除结点的指针,因此这里就不需要链表的表头指针和待删除结点的值了。

至于为什么示例输入中仍需要整个链表和待删除结点的值呢?这是因为力扣在后台构造输入参数时会用到这些数据。


语言特性导致的输入不同

不同语言由于语言特性的不同,也会导致输入输出的不同。

比如 54. 螺旋矩阵中:

0016253a7908ab4cd850b465dd1c904

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 语言的代码模版与示例输入有较大差异。