English?Click here

写在最前

作为 Leetcode 刷题系列的前言,我想给大伙儿和我自己说明一下这个系列的目的和参考。大家如果点进这篇文章就说明大家其实都想通过 Leetcode 来提升自己的码字实力,我与大家一样也渴望通过刷题通过后面的面试,而记录在博客不单单是为了记录这过程中我的所做所想,同样还为了对未来的自己提供一个可以快速复习的资源。当然如果这些文章能给你们也带来帮助那更好,这也证明我的文笔没有想的那么烂哈哈哈哈😂

题组来自哪?

很多人跟我一样在第一次接触 Leetcode 时对于该去刷哪道题完全没有头绪,在这里就要非常感谢这些将所有的题目进行过滤并进行排序组合的大佬们给后辈们铺好了路!资源有很多,但目前来说我将以 “代码随想录” 提供的刷题攻略进行练习,在这里再次感谢他们无私的奉献!!!

代码规范

在刷题时,代码的规范性同样需要注意,这也是一个巩固自己代码规范的机会。很多人不屑于了解代码规范,将重心放在功能的实现上,这在未来大公司的小组里是非常致命的!不规范的代码会对后期的维护十分困难,也是公司招人的一个标准。

变量命名

主流有三种:

  • 小驼峰、大驼峰命名法
  • 下划线命名法
  • 匈牙利命名法

小驼峰: 第一个单词首字母小写,后面其他单词首字母大写。例如 int myAge;
大驼峰: 第一个单词的首字母也大写了。例如:int MyAge;
下划线: 名称中的每一个逻辑断点都用一个下划线来标记,例如:int my_age;
匈牙利: 变量名 = 属性 + 类型 + 对象描述,例如:int iMyAge;

代码空格

在运算符与函数之间使用空格隔开以增加代码可读性,例子如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 操作符左右一定要有空格
i = i + 1;

int i, j;
for (int listIndex = 0; listIndex < num.size(); listIndex++)

// 大括号和函数保持同一行
while (n) {
n--;
}

// 控制语句 (while, if, for) 后都有一个空格
while (n) {
if (k > 0) return 9;
n--;
}

上述所有代码源自 https://programmercarl.com/前序/代码风格.html#题外话

刷力扣 (Leetcode) 用不用库函数?

刷题的本质就是让我们清楚如何对一些概念的实现,而库函数同样也是如此。如果一道题可以直接调库函数就能解决大部分问题,那么这就失去了它的意义。就好比你在做作业,你可以参考答案去思考如何做这道题,但是如果你直接选择把答案抄下来,那么你什么也学不到。因此在这里关于是否使用库函数有一个标准:

  1. 如果题目关键的部分直接用库函数就可以解决,建议不要使用库函数。
  2. 如果库函数仅仅是 解题过程中的一小部分,并且你已经很清楚这个库函数的内部实现原理的话,那么直接用库函数。

使用库函数最大的忌讳就是不知道这个库函数怎么实现的,也不知道其时间复杂度,上来就用,这样写出来的算法,时间复杂度自己都掌握不好的。

例如for循环里套一个字符串的insert,erase之类的操作,你说时间复杂度是多少呢,很明显是O(n^2)的时间复杂度了。

核心代码模式 & ACM模式

以一段代码实例为例:

核心代码模式:

1
2
3
4
5
6
class Solution {
public:
int getDays(vector<int>& work, vector<int>& gym) {
// 处理逻辑
}
};

ACM模式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<iostream>
#include<vector>
using namespace std;
int main() {
int n;
while (cin >> n) {
vector<int> gym(n);
vector<int> work(n);
for (int i = 0; i < n; i++) cin >> work[i];
for (int i = 0; i < n; i++) cin >> gym[i];
int result = 0;

// 处理逻辑

cout << result << endl;
}
return 0;
}

通过上述代码对比可以看出,核心代码模式直接写核心逻辑就行了,work数组,gym数组都是填好的,直接拿来用就行,处理完之后 return 结果就完事了。 而ACM模式要求写出来的代码是直接可以本地运行的,所以我们需要自己写include哪些库函数,构造输入用例,构造输出用例。

参考

leetcode-master by youngyangyang04 from GitHub