如何優雅的使用clion刷leetcode
安裝插件:LeetCode Editor)
插件配置:

這樣我們每打開一個項目,就會創建類似的文件

我們的項目結構:

我們在題解文件中導入頭文件myHeader.h
并將新建的文件添加到cmakelists.txt文件,這樣就不會報錯了
- myHeader.h
#ifndef MY_HEADER_H
#define MY_HEADER_H#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <map>
#include <unordered_map>
#include <set>
#include <unordered_set>
#include <stack>
#include <queue>
#include <deque>
#include <list>
#include <cmath>
#include <climits>
#include <cfloat>
#include <cstddef>
#include <cassert>
#include <numeric>
#include <functional>
#include <sstream>
#include <iterator>
#include <bitset>
#include <iomanip>
#include <memory>
#include <tuple>
#include <array>
#include <stdexcept>
#include <fstream>
#include <regex>
#include <random>
#include <chrono>
#include <initializer_list>
#include <utility>using namespace std;#endif // MY_HEADER_H
- CMakeLists.txt
cmake_minimum_required(VERSION 3.28)
project(LeetCodeTime)set(CMAKE_CXX_STANDARD 17)# 添加源文件,選擇運行的題解
file(GLOB SRC_FILES ${PROJECT_SOURCE_DIR}/leetcode/editor/en/twoSum.cpp)add_executable(LeetCodeTime main.cpp ${SRC_FILES})# 添加自定義編譯選項,選擇運行的題解
add_definitions(-DPROBLEM_FILE="\\\"twoSum.cpp\\\"")target_include_directories(LeetCodeTime PUBLIC ${PROJECT_SOURCE_DIR}/include)
這里的
add_definitions(-DPROBLEM_FILE="\\\"twoSum.cpp\\\"")
是為了方便調試,以后要調試哪個題解,就將哪個題解的文件名替換掉twoSum.cpp
,還要記得修改file(GLOB SRC_FILES ${PROJECT_SOURCE_DIR}/leetcode/editor/en/twoSum.cpp)
,這樣就能調試了~
- main.cpp
#include <iostream>
using namespace std;
void runProblem();
int main() {cout << "Running problem: " << PROBLEM_FILE << endl;runProblem();return 0;
}
- twoSum.cpp
// 1 Two Sum 2024-07-09 19:44:32
#include "myHeader.h"
//leetcode submit region begin(Prohibit modification and deletion)
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[j] == target - nums[i]) {return {i, j};}}}return {};}
};
//leetcode submit region end(Prohibit modification and deletion)void runProblem() {Solution solution;vector<int> nums = {2, 7, 11, 15};int target = 9;vector<int> result = solution.twoSum(nums, target);for (int num : result) {cout << num << " ";}cout << endl;
}
例如,我們要調試
兩數之和
這道題,我們就需要實現runProblem
,自行設置測試用例,這樣通過打斷點就能調試了~,注意,這里的runProblem
方法是最簡單的方法,必要情況下,你可以完善如下功能,創建一個生成測試用例的函數,同時輸出與正確答案結果不同的測試用例,至于正確結果,可以直接拿題解的就行。例如如下示例
// 1 Two Sum 2024-07-09 19:44:32
#include "myHeader.h"
//leetcode submit region begin(Prohibit modification and deletion)
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[j] == target - nums[i]) {return {i, j};}}}return {};}
};
//leetcode submit region end(Prohibit modification and deletion)
class CorrectSolution {
public://這是官方題解vector<int> twoSum(vector<int>& nums, int target) {unordered_map<int, int> map;for (int i = 0; i < nums.size(); ++i) {int complement = target - nums[i];if (map.find(complement) != map.end()) {return {map[complement], i};}map[nums[i]] = i;}return {};}
};
// 生成測試用例
void generateTestCases(vector<pair<vector<int>, int>>& testCases) {testCases.push_back({{2, 7, 11, 15}, 9});testCases.push_back({{3, 2, 4}, 6});testCases.push_back({{3, 3}, 6});// 可以添加更多測試用例
}
//調試邏輯
void runProblem() {Solution solution;CorrectSolution correctSolution;vector<pair<vector<int>, int>> testCases;generateTestCases(testCases);for (auto& testCase : testCases) {vector<int> nums = testCase.first;int target = testCase.second;vector<int> result = solution.twoSum(nums, target);vector<int> correctResult = correctSolution.twoSum(nums, target);// 比較結果,如果不同,則輸出錯誤的測試用例if (result != correctResult) {cout << "Input: nums = [";for (size_t i = 0; i < nums.size(); ++i) {cout << nums[i] << (i < nums.size() - 1 ? ", " : "");}cout << "], target = " << target << endl;cout << "Your Output: [";for (size_t i = 0; i < result.size(); ++i) {cout << result[i] << (i < result.size() - 1 ? ", " : "");}cout << "]" << endl;cout << "Correct Output: [";for (size_t i = 0; i < correctResult.size(); ++i) {cout << correctResult[i] << (i < correctResult.size() - 1 ? ", " : "");}cout << "]" << endl;cout << "Test case failed." << endl;} else {cout << "Test case passed." << endl;}cout << "--------------------" << endl;}
}
注意,再clion上提交代碼時,只會提交以下被包裹的代碼,其他代碼是不會被提交的,
雖然通過這個模板,我們到時候只需要修改生成測試用例的代碼,官方題解和修改cmake文件就能進行調試了~
,總體來說并不復雜,開始時可能不太熟練,但寫多一兩次就很快了,同時,生成測試用例的代碼并不是沒有用,打比賽時的測試用例也是要自己生成的,寫熟練以后對以后打比賽還是有點用的。//leetcode submit region begin(Prohibit modification and deletion) 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[j] == target - nums[i]) {return {i, j};}}}return {};} }; //leetcode submit region end(Prohibit modification and deletion)