1. 數(shù)據(jù)結(jié)構(gòu)與算法
- 面試中對數(shù)據(jù)結(jié)構(gòu)和算法的考察就是手寫代碼解決具體題目
- 這種解題的能力或者編程的能力是可以通過有意識的訓(xùn)練來提高的,即使你是一個菜到不行的菜鳥
- 科學(xué)訓(xùn)練包括了有目的的重復(fù)性訓(xùn)練则酝、周期性總結(jié)
- 下面章節(jié)中的示例代碼只是為了說明解題思路殉簸,更容易理解,所以他們不一定是最優(yōu)的
1.1 第一階段-重溫基本數(shù)據(jù)結(jié)構(gòu)
Tip: 我們大部分練習(xí)題目來自leetcode沽讹,請小伙伴們先行注冊一下般卑。
Tip: leetcode雖然現(xiàn)在已經(jīng)上線了中文網(wǎng)站,但還是建議大家使用原版爽雄,順便練習(xí)下英文理解能力
Note: 第一階段計劃我們通過嘗試解決一些簡單題目蝠检,幫大家熟悉常見的數(shù)據(jù)結(jié)構(gòu)及其表達方式
- 我們會使用固定的流程(理解題目-畫圖-核心代碼-完善邊界條件-優(yōu)化)去解決這些問題,目的是想幫助小伙伴們一開始就建立一個比較良好的思維習(xí)慣挚瘟,解決一道題目的重點在于理清解題思路叹谁,對應(yīng)的代碼實現(xiàn)是一個熟能生巧的過程。有些小伙伴一見到題目乘盖,就急急忙忙去直接思考代碼怎么實現(xiàn)焰檩。在初級階段,我們不建議這么做订框。
Note: 小伙伴們的主要任務(wù)是把下面題目代碼敲一遍提交到leetcode
Note: 這一階段你可以過的比較放松析苫,琢磨明白下面題目的示意圖和代碼的對應(yīng)關(guān)系就可以了。
1.1.1 數(shù)組
217. Contains Duplicate
判斷一個整數(shù)數(shù)組是否包含重復(fù)元素,包含返回true衩侥,否則返回false
1.舉例子-畫圖-解題思路
總體思路是:將集合中元素兩兩比較
- 從第一個元素(5)開始依次與后面元素進行比較国旷,5-6、5-7顿乒、5-6议街,沒有重復(fù)元素
- 從第二個元素(6)開始依次與后面元素進行比較,6-7璧榄、6-6特漩,發(fā)現(xiàn)相等元素(6),返回true
2. 寫核心邏輯代碼
通常涉及無序數(shù)組nums的兩兩元素比較骨杂,可以直接應(yīng)用下面的雙重循環(huán)框架:
for (int i = 0; i < nums.size(); ++i)
{
for (int j = i+1; j < nums.size(); ++j)
{
//判斷邏輯
}
}
利用上個模板我們直接寫出本題核心代碼
for (int i = 0; i < nums.size(); ++i)
{
for (int j = i+1; j < nums.size(); ++j)
{
// 遇到相等的元素直接返回true
if (nums[j] == nums[i]) return true;
}
}
3. 完善邊界條件并提交代碼
除了核心邏輯外涂身,邊界條件的考慮是必不可少的一個環(huán)節(jié),例如nums沒有元素或者只有一個元素時候我們的代碼應(yīng)該返回什么結(jié)果搓蚪。加上邊界條件后的代碼如下:
class Solution {
public:
bool containsDuplicate(vector<int>& nums) {
int n = nums.size();
if(n <= 1) return false;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < i; ++j) {
if (nums[j] == nums[i]) return true;
}
}
return false;
}
};
上述代碼按Submit Solution按鈕后蛤售,會提示: Submission Result: [Time Limit Exceeded],意思是在驗證一些特殊case時候算法超時了妒潭,需要我們優(yōu)化算法
4. 更優(yōu)方案
Tip: 上面的情況有些類似我們面試時候的套路:
所以我們會想:如果在一個有序數(shù)組中查找重復(fù)數(shù)字是否能提高效率悴能?
可以看到,不同于上面的雙重循環(huán)雳灾,排序后只需要一次遍歷中比較相鄰元素是否相等就可以了漠酿。
class Solution {
public:
bool containsDuplicate(vector<int>& nums) {
//邊界條件
if(nums.size() <= 1)
return false;
//先對無序數(shù)組排序
sort(nums.begin(),nums.end());
//一次遍歷,每個元素都與它前面的元素進行對比
for(int i = 1; i < nums.size(); ++i)
{
if(nums[i] == nums[i -1])
return true;
}
return false;
}
};
提交上面的代碼谎亩,可以得到 Submission Result: [Accepted]的提示炒嘲,意味著你已經(jīng)在leetcode上提交了第一段驗證通過的代碼,恭喜下自己吧
劇透: 后面我們還會看到使用hash table來解決上面這個問題
5. 總節(jié)
- 我們知道了數(shù)組這一數(shù)據(jù)結(jié)構(gòu)的表達方式(vector)
- 我們學(xué)到了第一個常用技巧:先排序再處理
- 我們使用了一個最簡單的算法:雙重循環(huán)
怎樣應(yīng)對IT面試與筆試-(一)
怎樣應(yīng)對IT面試與筆試-(二)
怎樣應(yīng)對IT面試與筆試-(三)
怎樣應(yīng)對IT面試與筆試-(四)
怎樣應(yīng)對IT面試與筆試-(五)
怎樣應(yīng)對IT面試與筆試-(五-1)
怎樣應(yīng)對IT面試與筆試-(六)
怎樣應(yīng)對IT面試與筆試-(七)
怎樣應(yīng)對IT面試與筆試-(八)
怎樣應(yīng)對IT面試與筆試-(九)
怎樣應(yīng)對IT面試與筆試-(十)
怎樣應(yīng)對IT面試與筆試-(十一)
怎樣應(yīng)對IT面試與筆試-(十二)
怎樣應(yīng)對IT面試與筆試-(十三)
怎樣應(yīng)對IT面試與筆試-(十四)
怎樣應(yīng)對IT面試與筆試-(十五)
怎樣應(yīng)對IT面試與筆試-(十六)