2020-02-11
實現夢想其實沒什么訣竅,就是比別人早起一點,晚睡一點,比別人早准備一點,勤奮一點。考研也一樣。
一個寫不出合格代碼的計算機專業的學生,即便僥幸考上了研究生,也不過是給將來的失業判個緩期執行而已。
【1_從零開始】
- 機試考察的能力:
-
- 將實際問題抽象成數學問題
- 將專業知識運用到數學模型
- 將設計的算法編寫成可執行程序
(其中包括1:會編寫經典算法的程序代碼 2:能將自己設計的算法轉換為程序代碼 3:健壯性,即所寫程序能應對各種測試數據)
- 特殊判題(Special Judge):此類題可能存在多個符合條件分答案,要求輸出任意一組解即可
- 大多數考題只對時間做限制,此時要有“空間換時間”的思想。11:52:07
【2_經典入門】12:25:59
【2.1_排序】
【2.1.1_對基本數據類型排序】
- 需要連續測試多組數據時,循環條件該怎么寫?
while(scanf("%d",&n)!=EOF)
- scanf()是有返回值的,它將返回輸入函數成功賦值的變量個數(此例中為1個,即n)
- EOF(end of file)的值為-1,當scanf函數不再為n賦值時返回EOF,跳出循環
- 使用該循環判斷條件是為了:既能測試多組數據,又能在輸入結束后正常退出。
- 不同編譯環境下for循環中指示變量 i 的作用域不同
- C++標准中,i 的作用域僅限於for循環內部;於是我們可以在多個for循環中都重新定義變量 i
- VC6.0中,在退出for循環后,變量 i 依然可見;因此在后續for循環中不必重新定義 i ,只需將 i 初始化即可。
- 冒泡排序
1 for(int i = 0; i < n; i ++){ 2 for(j = 0; j < n-1-i; j ++){ 3 if(buf[j] > buf[j + 1]){ 4 int tmp = buf[j]; 5 buf[j] = buf[j + 1]; 6 buf[j + 1] = tmp; 7 } 8 } 9 }
C++有快速排序庫函數,可通過包含#include<algorithm>頭文件后直接調用
- sort(first,last,cmp)函數
可省略第三個參數,此時默認為升序排列
若想得到降序排列的結果,可以改寫cmp(),默認return x<y; 改為 return y<x;13:52:24
sort()函數根據小於運算符“<”來定序,小者在前。
【2.1.2_對結構體排序】
- 重新定義比較函數cmp()
1 struct stu{ 2 char name[101]; 3 int age; 4 int score; 5 }buf[1000]; 6 bool cmp(stu a, stu b){ 7 if(a.score != b.score) return a.score < b.score 8 int tmp = strcmp(a.name , b.name); 9 if(tmp != 0) return tmp<0; 10 else return a.age < b.age 11 }
- 另外,還可以在stu結構體內重載“小於運算符”即operator <(),來說明排序規則,此時sort()函數不必使第三個參數。(提倡使用)
1 struct stu{ 2 char name[101]; 3 int age; 4 int score; 5 bool operator < (const stu &b) const { 6 if (score != b.score) return score < b.score; 7 int tmp = strcmp(name , b.name); 8 if(tmp != 0) return tmp < 0; 9 else return age < b.age; 10 } 11 }buf[1000];
【2.2_日期類問題】
【2.2.1_日期差值(區間問題)】
Guide:把原區間問題統一到起點確定的區間問題上
比如該日期與原點時間0000年1月1日之間的天數差
這樣可以在程序真正開始之前進行預處理——算出所有日期與原點日期的天數差並保存起來
- 需要開辟大量內存空間(如buf[5001][13][32])時
- 定義在函數體外,即全局變量
- 在函數中用malloc等函數動態申請變量空間
預處理是空間換時間的重要手段。
- 閏年
1 #define ISYEAP(x) x % 100 != 0 && x % 4 == 0 || x % 400 == 0 ? 1 : 0
定義一個宏用來判斷是否是閏年
將數據本身與數據的存儲地址聯系起來,是Hash的基本思想。
- 對於最常見的時間限制 1秒,算法復雜度通常不能超過百萬級別(7位),最多7位
【2.2.2_求星期幾】2020-02-11 18:05:25
2020-02-12 10:46:57
法一:
思路:仍以0000年1月1日為原點日期,處理出每個日期與原點日期之間的天數差,再求出給定日期與今天之間的天數差,又知道今天是星期幾,對天數差除7取余即可。
法二:
利用蔡勒(Zeller)公式,具體如下 圖片內容來自知乎https://zhuanlan.zhihu.com/p/79290515
——From《王道論壇計算機考研機試指南》