什么是核心代碼模式,什么又是ACM模式?
現在很多企業都在牛客上進行面試,很多錄友和我反饋說搞不懂牛客上輸入代碼的ACM模式。
什么是ACM輸入模式呢?就是自己構造輸入數據格式,把要需要處理的容器填充好,OJ不會給你任何代碼,包括include哪些函數都要自己寫,最后也要自己控制返回數據的格式。
而力扣上是核心代碼模式,就是把要處理的數據都已經放入容器里,可以直接寫邏輯,例如這樣:
- class Solution {
- public:
- int minimumTotal(vector<vector<int>>& triangle) {
- }
- };
如果大家從一開始學習算法就一直在力扣上的話,突然切到牛客網上的ACM模式會很不適應。
因為我上學的時候就搞ACM,在POJ(北大的在線判題系統)和ZOJ(浙大的在線判題系統)上刷過6、7百道題目了,對這種ACM模式就很熟悉。
接下來我給大家講一下ACM模式應該如何寫。
這里我拿牛客上 騰訊2020校園招聘-后臺 的面試題目來舉一個例子,本題我不講解題思路,只是拿本題為例講解ACM輸入輸出格式。
題目描述:
由于業績優秀,公司給小Q放了 n 天的假,身為工作狂的小Q打算在在假期中工作、鍛煉或者休息。他有個奇怪的習慣:不會連續兩天工作或鍛煉。只有當公司營業時,小Q才能去工作,只有當健身房營業時,小Q才能去健身,小Q一天只能干一件事。給出假期中公司,健身房的營業情況,求小Q最少需要休息幾天。
輸入描述:
第一行一個整數 表示放假天數
第二行 n 個數 每個數為0或1,第 i 個數表示公司在第 i 天是否營業
第三行 n 個數 每個數為0或1,第 i 個數表示健身房在第 i 天是否營業
(1為營業 0為不營業)
輸出描述:
一個整數,表示小Q休息的最少天數
示例一:
輸入:
4
1 1 0 0
0 1 1 0
輸出:
2
這道題如果要是力扣上的核心代碼模式,OJ應該直接給出如下代碼:
- class Solution {
- public:
- int getDays(vector<int>& work, vector<int>& gym) {
- // 處理邏輯
- }
- };
以上代碼中我們直接寫核心邏輯就行了,work數組,gym數組都是填好的,直接拿來用就行,處理完之后 return 結果就完事了。
那么看看ACM模式我們要怎么寫呢。
ACM模式要求寫出來的代碼是直接可以本地運行的,所以我們需要自己寫include哪些庫函數,構造輸入用例,構造輸出用例。
拿本題來說,為了讓代碼可以運行,需要include這些庫函數:
- #include<iostream>
- #include<vector>
- using namespace std;
然后開始寫主函數,來處理輸入用例了,示例一 是一個完整的測試用例,一般我們測了一個用例還要測第二個用例,所以用:while(cin>>n) 來輸入數據。
這里輸入的n就是天數,得到天數之后,就可以來構造work數組和gym數組了。
此時就已經完成了輸入用例構建,然后就是處理邏輯了,最后返回結果。
完整代碼如下:
- #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;
- }
可以看出ACM模式要比核心代碼模式多寫不少代碼,相對來說ACM模式更鍛煉代碼能力,而核心代碼模式是把側重點完全放在算法邏輯上。
國內企業現在很多都用牛客來進行面試,所以這種ACM模式大家還有必要熟悉一下,以免面試的時候因為輸入輸出搞不懂而錯失offer。
如果大家有精力的話,也可以去POJ上去刷刷題,POJ是ACM選手首選OJ,輸入模式也是ACM模式。