愉快地用 C 在 LeetCode 上刷题
Aug 18, 2019
2 minute read

当在用 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 写入的时间,降低了代码运行的耗时。真是超方便的呢~

希望大家能够用上这个小技巧,愉快地刷题~

参考




comments powered by Disqus