牛客网最全在线笔试、编程攻略(建议收藏)
共 3429字,需浏览 7分钟
·
2020-09-15 05:34
来源:牛客网
整理:大数据肌肉猿
一、常见问题
设备问题
问: 浏览器使用问题?
答:浏览器推荐使用最新版本的Chrome或者火狐浏览器,如果某一浏览器出现问题可以换个浏览器重新打开页面。
问: 摄像头如何调成前置?
答:进入答题页面前,可以在笔试调试设备页面可以直接切换摄像头;
笔试过程中如果需要切换摄像头,可以先进入调试设备页面
(exam.nowcoder.com/test/video),切换好摄像头后,结束调试,返回笔试答题页面,刷新页面即可,可能会造成离开一次页面。
问: 摄像头出错?
答:请确认你的摄像头连接正常,并且浏览器没有禁用(地址栏旁边有个摄像头图标上面有小叉就是禁用了)。笔试前可以打开
exam.nowcoder.com/test/video可以去这个页面检查设备。
问: 拍照失败怎么办?
答:拍照上传失败,请检查浏览器有没有adblock adguard等这种广告屏蔽插件,如有请关闭后重试,笔试前最好禁用所有浏览器插件和无关的应用程序。
问:小程序扫码异常(部分企业的笔试不会开启该功能)
答:请按以下步骤检查:
1.手机是否已联网
2.微信更新至最新版
问:答题时提示手机异常 (部分企业的笔试不会开启该功能)
答:请确保手机网络连接正常,使用最新版微信APP,手机需要一直保持在小程序页面保持常亮(不要锁屏),建议笔试插上手机电源,防止手机意外关机
笔试前可以打开nowcoder.com/cts/mini/test测试手机小程序,测试时间为3分钟,测试过程中出现手机异常,可以在本帖下面留下手机型号。
答题相关
问:只收到笔试短信通知,没有邮件通知,无法获取笔试链接怎么办?
答:请前往投递简历使用的邮箱垃圾箱查看,如果仍不能找到,就关注公众号:牛客招聘助手 ,绑定收到短信通知的手机号码查询。
问:打开笔试链接提示“不符合本场考试资格”,应该怎么处理?
答:请确认你是否拷贝了完整的笔试链接(含16位ID)并粘贴至浏览器地址栏。
问:没有收到邮件通知,怎么办?
答:如果你收到短信通知,但没有收到邮件通知,无法获取笔试链接,你可以关注微信公众号“牛客招聘助手”,绑定你收到短信的手机,查询笔试链接。
问:确认个人信息时,发现个人信息有误?
答:应企业要求,部分个人信息考生不能修改,请通过信息下方“点此反馈”入口,更正你的个人信息;如果可以修改,直接修改即可。
问: 笔试答题(非编程题)可以离开页面?
答: 不同公司的要求不一样,请仔细阅读考试须知,如要求不能离开页面,笔试过程请务必不要跳出页面,跳出页面会做作弊标记的哦。
问:问答题可以上传图片吗?
答: 问答题支持使用手机扫码上传图片,也支持本地上传。
问:回答了的题目可以再次查看吗?
答: 试卷中的题目分为多个目录,每个目录的题目提交后,就不能再次进入该目录;如果该目录未提交,你可以通过点击答题卡切换到该目录的其他题目。
问:笔试未结束,关闭了答题页面,可以继续答题吗?
答: 笔试中途因误操作关闭答题页面,如果在考试时间内,你可以重新复制笔试链接,打开页面继续笔试。
问:笔试过程中发现题目问题或者其他系统使用问题,怎么办?
答:你可以通过右侧底部的在线咨询小窗选择问题类型后发消息咨询。
编程题相关
问: 编程题可以离开页面,进行本地调试吗?
答: 不同公司的要求不一样,请仔细阅读考试须知,点击进入编程题时也会有弹窗提示,请注意是否支持本地IDE,不支持时,请务必不要跳出页面,跳出页面会做作弊标记的哦。
问: 在线编程题是否可以使用本地IDE编辑和调试代码?
答: 部分企业会严格考察考生编辑代码的能力,会禁止考生离开编程题答题页面,不能使用本地IDE调试代码,你可以通过代码框上方的自测功能进行调试;允许使用本地IDE的笔试,可以使用本地IDE调试代码。
问:为什么我本地通过了,但是线上提交说没通过所有测试用例?
答:牛客网的每个编程题都有10-50组测试数据,你的代码在本机可以通过仅仅是通过了样例数据,可能存在边界条件考虑不周导致更多的测试数据没有通过,所以会返回答案错误。
问: 编程题的输入输出怎么写?
答:编程题分两种考核方式:
核心代码模式:只需要实现函数核心功能并返回结果,无须处理输入输出;
ACM模式:按照题目输入输出说明和例题给出的输入输出规范处理输入输出,不同的语言有不同的输入输出规范。
问: 没有通过所有测试用例是答案错了还是复杂度不对?
答:如果只提示没有通过所有的测试用例,那就不是超时的问题也不是编译的问题,仅仅是测试用例有部分没有通过,可能是代码考虑不够全面。
问: 编程题怎么算分?
答:题目会按照case通过比例给分,可以多次提交,不同考试会有不同计分规则,分为按照所有提交的最高分计分(如果多次提交的最高分一致,以最后一次最高分提交得分)、按照最后一次提交的最高分得分。
问:在线编程题支持哪些语言进行编译?
答:牛客在线编程题目前支持C++11、C++14、Java、C、Python、Python3、pypy2、pypy3、C#、PHP、JavaScript、R、Go、Ruby、Swift、ObjC、Pascal、Sql、TCL、matlab、bash等 语言,不同企业可能会对编程语言有限制要求,请仔细阅读笔试邮件通知,邮件中会有编程题语言的相关说明。
问:编程题代码直接输入到代码框就完成了吗?
答:编辑好代码后,一定要点击 保存并提交 !!!
根据不同计分模式会有所不同,如果试卷设置是按照所有提交的最高分计分,系统会在提交该模块时帮你自动提交一次;如果 试卷设置 是按照最后一次提交计分,系统不会帮着提交,总之:一定要点击 保存并提交 !!!
其他问题
问:考试过程中可以短暂离开吗?比如上厕所
答:可以,请快去快回!
问: 为什么我没有切页面弹窗说我跳出了?
答:请关闭所有可能屏幕提示的软件,包括QQ、OUTLOOK、杀毒软件等,只要屏幕失焦都算成是退出,如下图所示弹窗,均为跳出页面。
问:笔试时网络不好,页面加载慢,怎么办?
答:你可以将网络切换为手机热点,完成笔试。
重要提示:请在收到考试通知时,仔细阅读通知邮件中的注意事项,每次笔试的要求可能不一样。
二、编程判题规则
1. 判题系统的编译器信息
C/C++:clang++ 3.9 -std=c++14 -O -Wsign-compare -Wc++11-extensions
JAVA:javac 1.8 -encoding=utf-8
Python: python 2.7.3
Python3: python 3.2.3
C#: mcs 4.0.1
Go: go 1.8.3
2. 判题系统的输入输出
2.1对于<剑指Offer>这种有函数定义的题目,你只要完成函数,返回相关的值就可以,不需要处理任何输入输出,不要在函数里输出任何东西。
2.2 对于传统ACM的OJ模式题目,你的程序需要stdin(标准输入)读取输入,然后stdout(标准输出)来打印结果,举个例子,你可以使用c语言的scanf或者c++的cin来读取输入,然后使用c语言的printf或者c++的cout来输出结果。代码禁止读取和写入任何文件,否则判题系统将会返回运行错误。OJ一次处理多个case,所以代码需要循环处理,一般通过while循环来出来多个case。
以下是A+B题目的样例代码:
计算a+b的和:
每行包含两个整数a和b
对于每行输入对应输出一行a和b的和
输入
1 5
输出
6
C64位输出请用printf("%lld")
1 2 3 4 5 6 7 |
|
C++64位输出请用printf("%lld")
1 2 3 4 5 6 7 |
|
JAVA, 注意类名必须为Main, 不要有任何package xxx信息
注意hasNext和hasNextLine的区别,详细见 https://www.nowcoder.com/discuss/8050> 1 2 3 4 5 6 7 8 9 10 11 12 C# 1 2 3 4 5 6 7 8 9 Python 1 2 3 4 5 6 7 8 9 10 Python3 1 2 3 4 JavaScript(V8) 1 2 3 4 5 6 JavaScript(Node) R语言 1 2 3 4 5 6 7 8 9 10 11 matlab 1 2 3 4 5 6 7 8 3. 判题系统状态 等待评测: 评测系统还没有评测到这个提交,请稍候 部分正确: 您的代码只通过了部分测试点,继续努力! 1、为什么需要循环输入输出:通常来说OJ对于每道题里面有.in和.out文件,分别表示测试数据的输入和输出。如果某些编程题的所有数据都只做在一个.in和一个.out中,这样就会变成多组测试了,所以需要提交的代码中循环处理。 2、处理方法:其实这个问题可以避免,就是编程题后台每个样例做一组对应的.in和.out文件,这样就变成单组测试,代码就不需要循环处理,但是平时练习的题目质量不一,这个问题都会出现。 代码里面循环处理了即使是单组测试也会完全没问题,所以为了偷懒,可以全写成循环处理。 3、还有一个坑:如果测试数据是多组的,但是恰巧你代码里面需要些标记数组,map,set等,在循环内一定记得清空,不然可能会产生前面的测试样例影响了后续数据的答案。 1、出题人通常会使用C/C++编写标程,数据也是由标程制造的,所以使用跟出题人一样的语言会比较稳妥 2、C/C++效率比较高,通常来说一般OJ对于一道题目的时限限制会区分C/C++和其他语言,通常处理方式是假设C/C++时限是1s,其他语言就会给2倍时限,甚至更多。 3、关于cin cout和scanf printf。做题的时候尽量使用scanf printf。下面告诉一个小常识,不要惊讶:在数据量比较大的情况下cin cout比scanf printf慢挺多。一旦遇到大数据量,光是读入就有可能跪掉。你或许可以使用std::ios::sync_with_stdio(false); 这条语句关掉scanf和cin的同步,加快效率。但是即使这样cin还要慢,而且一旦使用了这条语句,scanf和cin混用可能就会造成一些奇怪的错误 4、Java相关:Java整体效率大概比C/C++慢2倍以上,但是Java写编程题也没什么问题,主要就是处理好各种输入输出的情况。 5、python等等其他语言, 做编程题首先要自己在平台上多练习不同的数据格式的读取方法,还有就是效率可能偏低,另外有些语言封装的功能太丰富了,以至于代码里各种函数完成的最终代码,笔试官或者面试官对于算法的考察并不想看到这样的code。 6、开辟数组空间最好根据题目的数据范围要求来,这里可能会造成runtime error,如果代码中递归的深度太深也可能爆栈空间导致
runtime error。 格式问题经常令人抓狂,其实主要都有几个常见的坑 1、行末空格:比如我输出需要打印多个数需要使用空格分隔的时候,我们循环使用printf("%d ",x);这种会很方便,但是这样会导致行末多一个空格,后台系统会严格比对你的输出和.out文件,这样也会被判错误 2、换行问题,对于每个样例,建议输出完全之后都换行一下。对于一些题目,可能就是不换行就导致了后面输入数据错位,那就肯定不可能过了。 通常来说一般的系统1s能跑的算法量级是不足1e8的,所以做题的时候评估算法效率很重要,直接判断你的做法能否通过,当然这是以C/C++为标准的,其他语言自己乘个时间倍数。 举个例子,比如题目n = 1e5,那么我就可以很敏感的知道我的算法需要一个 O(n) 或者 O(nlogn)。平方复杂度直接超时! 这个问题很蠢!通不过就是有一些问题。一个是要累积经验,分析到底可能出现的问题在哪里。另外不要使用一些奇怪的函数和行为。之前有见过有人使用了windows和linux平台那个功能的函数名都不一样的奇葩函数,所以要使用标准的跨平台的库函数。各个语言一般平台都会告诉你每种语言给的编译器版本,这个环境信息也是很重要的。import
java.util.Scanner;
public
class
Main {
public
static
void
main(String[] args) {
Scanner in =
new
Scanner(System.in);
while
(in.hasNextInt()) {
//注意while处理多个case
int
a = in.nextInt();
int
b = in.nextInt();
System.out.println(a + b);
}
}
}
public
class
Program {
public
static
void
Main() {
string line;
while
((line = System.Console.ReadLine ()) !=
null
) {
//注意while处理多个case
string[] tokens = line.Split();
System.Console.WriteLine(
int
.Parse(tokens[
0
]) +
int
.Parse(tokens[
1
]));
}
}
}
import
sys
try
:
while
True:
line = sys.stdin.readline().strip()
if
line ==
''
:
break
lines = line.split()
print
int
(lines[
0
]) +
int
(lines[
1
])
except:
pass
import
sys
for
line
in
sys.stdin:
a
=
line.split()
print
(
int
(a[
0
])
+
int
(a[
1
]))
while
(line=readline()){
var
lines = line.split(
' '
);
var
a = parseInt(lines[0]);
var
b = parseInt(lines[1]);
print(a+b);
}
var readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.on('line', function(line){
var tokens = line.split(' ');
console.log(parseInt(tokens[0]) + parseInt(tokens[1]));
});
lines=readLines(
"stdin"
)
for
(l in lines){
if
(l ==
""
){
break
;
}
ll = strsplit(l,
" "
)[[1]]
a=ll[1];
b=ll[2];
cat(as.numeric(a)+as.numeric(b));
cat(
'\n'
);
}
try
while
1
line = input(
''
,
's'
);
lines = strsplit(line);
printf(
"%d\n"
, str2num(lines{
1
}) + str2num(lines{
2
}));
end
catch
end
正在评测: 评测系统正在评测,稍候会有结果
编译错误:您提交的代码无法完成编译,点击“编译错误”可以看到编译器输出的错误信息
答案正确: 恭喜!您通过了这道题
运行错误: 您提交的程序在运行时发生错误,可能是空指针
格式错误: 您的程序输出的格式不符合要求(比如空格和换行与要求不一致)
答案错误: 您的程序未能对评测系统的数据返回正确的结果
运行超时: 您的程序未能在规定时间内运行结束
内存超限: 您的程序使用了超过限制的内存
异常退出: 您的程序运行时发生了错误
返回非零: 您的程序结束时返回值非 0,如果使用 C 或 C++ 语言要保证 int main 函数最终 return 0
浮点错误: 您的程序运行时发生浮点错误,比如遇到了除以 0 的情况
段错误 : 您的程序发生段错误,可能是数组越界,堆栈溢出(比如,递归调用层数太多)等情况引起
多种错误: 您的程序对不同的测试点出现不同的错误
内部错误: 请仔细检查你的代码是否有未考虑到的异常情况,例如非法调用、代码不符合规范等。
三、那些年我在牛客踩过的坑循环输入输出处理常见问题
对于各种语言的一些基本知识
关于输出格式
关于时间复杂度分析:
最后关于 "我本地能通过,交上去就是不对"