愉快地用 C 在 LeetCode 上刷题
当在用 C 在 LeetCode 上刷题,难免无法一次 AC。而在 LeetCode 上又无法调试,只能用 printf 大法,输出一些简单的日志,比如代码运行时的变量值等。当代码 AC 后,为了降低代码运行的时间消耗,则需要把 printf 的代码删除或者注释掉。这就有点麻烦了,因为使用 printf 的代码越多,需要删除或注释掉的地方就越多。
通过使用C的预处理指令 #define
, #ifdef
, #else
, #endif
这几个简单的指令,再加上函数式的宏(Function-like Macros),就可以只注释一行代码,即可把日志输出去掉。听起来是不是很方便呢?接下来就用 LeetCode 的第 2 题,两数相加,来据一个简单的例子。
#define __WITH_LOG__
#ifdef __WITH_LOG__
#include <stdio.h>
#define LOG(message, args...) \
fprintf(stdout, "| %s:%d | " message "\n", __FUNCTION__, __LINE__, ##args)
#else
#define LOG(message, args...)
#endif
struct ListNode *addTwoNumbers(struct ListNode *l1, struct ListNode *l2) {
struct ListNode dummy;
struct ListNode *last = &dummy;
int inc = 0;
while (inc || l1 || l2) {
last->next = malloc(sizeof(struct ListNode));
last = last->next;
last->val = inc;
LOG("last->val=inc; val=%d", inc);
if (l1) {
last->val += l1->val;
LOG("last->val+=l1->val; l1->val=%d, last->val=%d", l1->val, last->val);
}
if (l2) {
last->val += l2->val;
LOG("last->val+=l2->val; l2->val=%d, last->val=%d", l2->val, last->val);
}
if (last->val > 9) {
last->val -= 10;
inc = 1;
} else {
inc = 0;
}
if (l1)
l1 = l1->next;
if (l2)
l2 = l2->next;
}
last->next = 0;
return dummy.next;
}
跑个测试用例看看效果
以下是在 VSCode 使用 LeetCode 插件 jdneo/vscode-leetcode 使用默认测试用例测试所输出的结果
Input data:
[2,4,3]
[5,6,4]
Actual
✔ runtime: 0 ms
✔ answer: [7,0,8]
✘ stdout: '| addTwoNumbers:36 | last->val=inc; val=0\n' +
'| addTwoNumbers:39 | last->val+=l1->val; l1->val=2, last->val=2\n' +
'| addTwoNumbers:43 | last->val+=l2->val; l2->val=5, last->val=7\n' +
'| addTwoNumbers:36 | last->val=inc; val=0\n' +
'| addTwoNumbers:39 | last->val+=l1->val; l1->val=4, last->val=4\n' +
'| addTwoNumbers:43 | last->val+=l2->val; l2->val=6, last->val=10\n' +
'| addTwoNumbers:36 | last->val=inc; val=1\n' +
'| addTwoNumbers:39 | last->val+=l1->val; l1->val=3, last->val=4\n' +
'| addTwoNumbers:43 | last->val+=l2->val; l2->val=4, last->val=8'
Expected
✔ runtime: 24 ms
✔ answer: [7,0,8]
✔ stdout: ''
通过简单地注释掉 #define __WITH_LOG__
,就可以让代码运行时不输出日志,也就少了 IO 写入的时间,降低了代码运行的耗时。真是超方便的呢~
希望大家能够用上这个小技巧,愉快地刷题~