很多人應該都在牛客網做過算法題,今天教大家如何答題的時候劫持函數調用入口(僅供C++)。
我的出發點是,不要為了刷題而刷題,偶爾研究一下牛客網線上程式設計的答題機制也是好的。其實寫代碼解題追求排名也是一種了樂趣。
如下是我的截圖:
大家可以看到,我實作方法那裡根本就沒實作,但是程式還是判定我通過的。而且記憶體占用和運作時間都是低到不可思議。:)
首先我們利用C++的特性重寫,來重新聲明main函數。這樣就能從代碼運作的入口劫持。為啥說是劫持呢,因為我們這樣幹肯定是背離了原本要實作方法的初衷。
大家都知道,主程式運作main是唯一的,也是一切程式運作的起始點。
我的截圖可以看到通過自己實作main,就不需要調用指定的方法函數了。
我們能看到很多題目都提供測試資料(不用我們自己輸入),原因是環境肯定用了腳本來自動輸入資料。C++的輸入形式應該是類似終端輸入,是以可能是cin 或者scanf。
同理,那麼程式需要的結果不能在代碼裡直接驗證,而是用腳本來驗證,是以結果輸出就是cout或者printf。
class Solution {
public:
/**
* 代碼中的類名、方法名、參數名已經指定,請勿修改,直接傳回方法規定的值即可
*
*
* @param s string字元串
* @return string字元串
*/
string replaceSpace(string s) {
// write code here
}
};
int main(){
init:
char the;
string res;
int r;
while((r=scanf("%c",&the)) != EOF){ //一個一個字元去擷取
if(r == 1){
if(the == ' '){
res += "%20"; //遇到為空則直接替換
}else{
res += the;
}
}else{
//安全保護
r = getchar();
r = getchar();
if(r == '\n')
goto init;
else
ungetc(r, stdin);
}
}
printf("%s\n",res.c_str()); //你的結果列印。腳本會驗證
return 0;
}
#define main main2
原題
當然啦,這題作為舉例還是比較簡單,如果是難度稍微高的題目,我們完全可以去劫持輸入的參數直接輸出,而不用調用函數方法了。
但是這種方法比較适合用于有目标的題型,如查找target,直接從輸入字元那裡周遊去做判斷。
好啦,更多有趣的玩法還需要你們去發掘。
完