標籤:整數 字元 演算法 最大 日期 好的 運算 記憶體 區間問題
使用王道機試指南的電子書也有幾天的時間了,終於看完了第二章《經典入門》,下面就來總結回顧一下最常見的六種演算法/問題,為下一步刷題打好堅實基礎。
套路是:先概述這種題型,然後總結我學到的和易錯點。
************************************題目都是九度OJ上的**********************************************
先提一句!時間複雜度!王道一直在提這一點,必須有根據題目中變數的範圍來估算時間複雜度的意識。
一、排序問題
- 基本的冒泡、選擇排序自不必說,必須掌握。
- C語言的qsort,C++的sort,我都是第一次知道。。
- sort的兩種使用方法,要麼重載<運算子,要麼自己寫cmp函數,總之就是讓sort函數知道比較規則是什麼。cmp函數的寫法,比如降序排列,第一個參數比第二個參數大時返回true就好。
- 1061題,結構體排序,也沒啥,還是用sort,可在結構體裡面定義重載運算子,即規則定義在裡面。也可在外面寫cmp函數。注意重載的寫法。
- 1185題特殊排序,其實很簡單,如果逆向思維的話:先排序,自然最大的就出來了,而且題目沒說清刪一個還是全刪,我剛開始全刪了,一直WA,結果根本沒那麼複雜。。。刪一個就行。
- 1023,自己寫的代碼總是RE,至今未明。但大概知道,比較規則應寫的簡潔明晰,不要太長更不要跟全域變數什麼的扯上關係。。我目前只能這麼理解了,說的不對的話歡迎大神給我指出錯誤
二、日期類問題
- 重要的思想:預先處理。解決區間類問題的統一思想:把原區間問題統一到固定起點的區間問題上去
- 1096,第一次接觸類編程。可以用struct定義類,類裡有一個成員函數,即一個方法。大記憶體數組定義成全域變數。
- 1043,注意取餘運算的應用。
三、Hash
- 適用的類型:某變數範圍有限、固定、有特點。1431大範圍整數排序、1156根據讀書判斷潛在朋友、1088拔樹 這些問題都適合Hash
四、排版題
兩類,一種是簡單排版,即幾何規律與輸出順序有聯絡。另一類難一點,沒聯絡,要先排版再輸出。1161題Repeater,簡直虐心。。關鍵是找到規律,迭代時候注意分不同情況,不要有衝突
五、尋找
- 線性尋找:遍曆,簡單
- 二分尋找:先用sort變成有序數組,再尋找。複雜度會從n變log。典型條件:while(a<=b)
六、貪心演算法
思想很簡單,就是總擷取最好的。(最符合目標要求的)但是有時候不容易找到合適的貪心策略
- 1433,碩鼠換糧題,抽象成為一個以性價比為貪心標準的問題。即:總是優先買性價比最高的商品,直到金錢花完或者這種物品被買完,那就換性價比次高的,以此類推
- 1434的今年暑假不AC,目標是儘可能多的看到完整的節目,那麼貪心的標準是以結束時間最早的節目優先,因為這樣總是能節約時間以增大更多的節目機會被看的可能性。1435的迷瘴,1436的修牆的貪心標準比較明顯。
貪心演算法中,while迴圈的判斷條件要仔細斟酌,明確要輸出幾個變數,有幾個變數作為輔助,初始條件是什麼,迴圈過程中會怎麼樣變化等等。
七、我的常見錯誤
- 最坑爹的肯定是scanf()函數,首先它是有傳回值噠,返回成功讀取變數的個數;傳入變數地址雖然很小兒科,但為了不忘記再說一句。。格式控制字元串中的一個空格可以抵消輸入中的n個空格,6不6.尤其注意輸入字元格式設定的時候,注意空格屬不屬於待輸入字元之內(排版題)屬於的話格式控制字元串中不能加空格;要不要用getchar()吸收。。注意斷行符號符也是需要吸收的,尤其排版題要注意。。。
- 常見WA的原因
- 標誌位!標誌位!計數器!計數器!是不是沒清零!!?!我最愛犯的錯誤,沒有之一。甚至有時莫名其妙的話你就應該想到看看標誌位清沒清,試著清一下。。。
- 演算法是否有錯
- 邊界資料是否有錯
- 是不是多組測試案例你只按一組編的
- 是不是某變數/數組聲明位置不對,導致第一次用完之後曆史資料沒清除,本質跟1一樣。所以變數隨用隨定義。
以上就是一周以來的學習總結。想要進一步強化編程,以上基礎必須打牢。
C/C++編程基礎演算法總結