很多人应该都在牛客网做过算法题,今天教大家如何答题的时候劫持函数调用入口(仅供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,直接从输入字符那里遍历去做判断。
好啦,更多有趣的玩法还需要你们去发掘。
完