有些刚开始刷Leetcode的朋友 往往在遇到wa提示不能正确解答问题的时候,仅靠添加打印来debug会比较吃力。
这时候希望能够将代码在本地运行,单步调试,以便提升debug的效率。
谢谢大家的点赞,本来还想这篇文章没啥太大作用,准备删除的。
因为写OJ题目应该尽量远离代码,人脑调试定位和走流程才是吸收效率最高的。
如果入门后,建议大家尽量避免使用打印以外的调试方式,学习才更有效率。
1 常规题目
使用本地的C++编译执行工具。
添加头文件 添加Leetcode的类 和 main函数 调用该类,并且输入数据
以Leetcode 1 两数之和 为例
这里的输出不正确,那么我们在本地的代码应该如下:
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
for (int i = 0; i < nums.size(); i++) {
for (int j = i + 1; j < nums.size(); j++) {
if (nums[i] + nums[j] == target) {
return vector<int>{i, j};
}
}
}
return vector<int>();
}
};
int main()
{
//main函数中新建一个类 ,并且调用该类的函数,
Solution s;
//输入的数据要根据网页提示 自行创建
vector<int> v{ 2,7,11,15 };
s.twoSum(v,9);
return 0;
}
这样就可以在本地单步调试代码,更优效率的定位BUG,对算法代码也能理解的更加深入.
如图
2 链表题目
链表题目的本地调试和常规题目类似,但是数据的创建会稍微麻烦一些
需要实现声明数据结构的定义并且 自行创建一个链表,相比输入vector数据会更麻烦一些
以 Leetcode 83 删除排序链表中的重复元素 为例
输入的链表数据是 1->1->2
本地代码应该如下
#include <iostream>
#include <vector>
using namespace std;
// Definition for singly-linked list.
//定义链表结构体
struct ListNode {
int val;
ListNode *next;
ListNode() : val(0), next(nullptr) {}
ListNode(int x) : val(x), next(nullptr) {}
ListNode(int x, ListNode *next) : val(x), next(next) {}
};
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if (!head) {
return head;
}
ListNode* cur = head;
while (cur->next) {
if (cur->val == cur->next->val) {
cur->next = cur->next->next;
}
else {
cur = cur->next;
}
}
return head;
}
};
int main()
{
//创建类 调用函数
Solution s;
//自行创建输入的链表数据
ListNode* head = new ListNode(1);
head->next = new ListNode(1);
head->next->next = new ListNode(2);
s.deleteDuplicates(head);
return 0;
}
就可以开始本地单步调试代码了。
二叉树的题目与链表题目类似。
你的事vscode吧,可以换成Dracula主题
vs2019
vs2019应该也可以换成Draclua,我更推荐使用vscode,比vs2019更好使用