天天看點

牛客網線上程式設計劫持函數入口 僅C++

很多人應該都在牛客網做過算法題,今天教大家如何答題的時候劫持函數調用入口(僅供C++)。

我的出發點是,不要為了刷題而刷題,偶爾研究一下牛客網線上程式設計的答題機制也是好的。其實寫代碼解題追求排名也是一種了樂趣。

如下是我的截圖:

牛客網線上程式設計劫持函數入口 僅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
           

原題

牛客網線上程式設計劫持函數入口 僅C++

當然啦,這題作為舉例還是比較簡單,如果是難度稍微高的題目,我們完全可以去劫持輸入的參數直接輸出,而不用調用函數方法了。

但是這種方法比較适合用于有目标的題型,如查找target,直接從輸入字元那裡周遊去做判斷。

好啦,更多有趣的玩法還需要你們去發掘。

繼續閱讀