出题指南
老师您好!欢迎来到“极客-服务中心”参与编程出题任务~
前言
首先,感谢您于繁忙的工作中抽出时间,为极客旗下职业学院的编程测评模块贡献题目。
编程测评,旨在帮助同学们通过测评题目盘点编程知识储备,发现自己在某个技能点上的优 劣势,以指导同学们更有针对性地进行高效学习。
下面是关于「出题」相关的步骤说明,请仔细阅读。
1 - 出题规范
1.1 出题标准
序号 | 题目-出题标准 |
---|---|
0 | 题型:编程出题全部为编程题; |
1 | 题目符合实效性(最新版本或主流版本),没有版本依赖 |
2 | 题目考察核心知识点 |
3 | 题目标题清晰无歧义,无错别字,无超链接 |
4 | 专有名词书写格式要求按官方写法( 如:MySQL、MongoDB ) |
5 | 图片清晰无水印 |
6 | 代码格式正确、缩进正常,可运行 ,无多余转义字符 |
7 | 测试用例设置合理(考虑题目极限情况、边界值等),且至少 2 个 |
8 | 示例代码可运行 |
9 | 答案解析合理(简洁明了,逻辑清晰,说明正确的解题思路) |
10 | 与技能点、知识点关联合理 |
11 | 题目来源设置合理(原创、网络、翻译、购买、改编、其他) |
12 | 题目难度设置合理(简单、普通、困难) |
13 | 建议答题时间合理 |
1.1- 出题规范
1.1 - 学员答题限制
- 不支持交互形式的输入输出
- 只能使用题目中所内置的公共包,不支持自行引入公共包
1.2 - 出题限制
- 不支持交互形式的输入输出
- 不要有修改或删除文件的操作,即不支持数据库的增删改功能,只能查询;不能向数据 库里存储数据;
- 建议使用一些官方的插件包,不推荐使用一些私人提供的第三方库,如有使用场景需求 需和研发确认添加。
1.3 - 注意事项
1.3.1 - 引入包
大多数语言中都需要将引入的包写清楚
如果需要额外安装非官方自带包,出题老师需要和极客对接人员提交相关需求
1.3.2 - 特殊符号
出题过程中一定要注意测试用例里面的换行和程序输出结果是否一致
特殊符号,碰到了就全部加上反引号
/n
{}
#
&
-
\
/
1.3.3 - 隐藏注释
传参方式如下,可以在代码之间加上如下注释,这样在学员端就不会显示:
- 说明:尽可能隐藏不需要学员关注的代码段,确保学员答题过程不会无意间修改这些代码 ,从而保证学员答题专注度
javascript
//hide-start
//hide-end
1.4 - 语言规范
1.4.1 - java
1.4.1.1 - 基本限制
- 不支持使用 Scanner 类
- 不支持多线程
- 不支持文件操作
- 不支持任何第三方的 jar 包引入
- 方法中请勿打印输出任何内容,方法直接返回计算结果
- 不要使用
System.out.println()
,而使用System.out.print()
,因为换行符在各处没 办法统一 - 所有打印的内容都放入 main()方法中,并将其 hide-start 隐藏
- 单独隔离一个类里面放需要解决问题的方法,如下面的 Solution 类
1.4.1.2 - 初始代码
- 数组入参【当前为临时方案;9 月底因编程引擎的升级,此规范会进行调整】
- service/fuwu 录入测试用例
a : "[1, 2, 3]"
- 在 Test 类的 main 方法里面 args[0]获取的就是 a 参数的值
- 将测试用例的字符串[1,2,3]通过正则解析为 ArrayList/int 对应的数组 num,变相 支持了数组输入。
- 动态数组
ArrayList: ArrayList< Integer > num = new ArrayList<>()
; - 固定数组
[]int arr = new int[strs.length]
- service/fuwu 录入测试用例
java
import java.util.*;
//hide-start
public class Main {
// main 里面主要做2件事情,1 解析参数为合适的类型;2 打印结果
public static void main(String[] args)
{
ArrayList<Integer> num = new ArrayList<>();
String[] strs = args[0].replaceAll("\\[|\\]", "").split("\\s+,\\s+");
for (String str : strs) {
num.add(Integer.parseInt(str));
}
int m = Integer.parseInt(args[1]);
System.out.print(Solution. splitMin(num, m));
}
}
//hide-end
class Solution
{
public static int splitMin (ArrayList<Integer> num, int m) {
// 请将您的代码逻辑填写在这里
}
}
- 简单入参
java
import java.util.*;
//hide-start
public class Test {
// main 里面主要做2件事情,1 解析参数为合适的类型;2 打印结果
public static void main(String[] args)
{
int m = Integer.parseInt(args[1]);
System.out.print(Solution.sum(m));
}
}
//hide-end
class Solution
{
public static int sum (int m) {
// 请将您的代码逻辑填写在这里
}
}
1.4.2 - JavaScript
1.4.2.1 - 基本限制
- 对于数据类型:null, undefined,对象 {} 等均不支持,只支持字符串
1.4.2.1 - 初始代码
javascript
//hide-start
var args = process.argv.splice(2);
console.log(bigNumPlus(args[0], args[1]));
//hide-end
function bigNumPlus() {
// 初始代码:包含这句话「请将您的代码逻辑填写在这里」
// 示例代码:老师将完整的示例代码填写到这里
}
1.4.3 - SQL
1.4.3.1 - 基本限制
- 测试用例中进行数据库建表操作(必须包含)
- 删除表语句:
drop table
- 建表语句:
create table
- 不要添加额外的删除和建库操作指令;
- 每行语句后面不要有额外的空格;
- 语句整体后面不要有多余的行;
- 删除表语句:
sql
drop table IF EXISTS fromAppUser;
create table fromAppUser(
tele_no varchar2(16) primary key,
first_name varchar2(50),
last_name varchar2(50),
province varchar2(50)
);
1.4.3.2 - 初始代码
- 主要是查询语句
sql
SELECT
tele_no,
'1' tbl_no,
first_name,
last_name,
province
FROM
fromSavingUser;
1.4.3.3 - 测试用例案例
1.4.4 - Python3.7
1.4.4.1 基本限制
- 由于
print()
默认输出换行, 如果测试用例无需换行,请注意print(result,end="")
1.4.4.2 初始代码
python
import sys
if __name__ == '__main__':
print(sys.argv[1])
1.4.5 - Python2.7
1.4.5.1 基本限制
- 由于
print()
默认输出换行, 如果测试用例无需换行,请注意print(result,end="")
1.4.5.2 初始代码
python
import sys
if __name__ == '__main__':
print(sys.argv[1])
1.4.6 - Shell
1.4.6.1 基本限制
无
1.4.6.2 初始代码
shell
#!/bin/bash
#接收参数
echo "第一个参数:"$1
1.4.7 - C++
1.4.7.1 基本限制
- 必须有 main 函数
1.4.7.2 初始代码
cpp
#include <iostream>
using namespace std;
int main()
{
cout << "hello world!" << endl;
return 0;
}
1.4.8 - C
1.4.8.1 基本限制
- 必须有 main 函数
- 系统已默认加入 C 语言的兼容代码,无需再次添加
1.4.8.2 初始代码
c
#include <iostream>
using namespace std;
int main()
{
cout << "hello world!" << endl;
return 0;
}
1.4.9 - Scala
1.4.9.1 基本限制
- Object 的名字必须为 Test
- 必须有 main 函数
1.4.9.2 初始代码
scala
object Test {
def main(args: Array[String]) {
println("Hello, world!")
}
}
1.4.10 - Golang
1.4.10.1 基本限制
- package 必须是 main
- 必须有 main 函数
1.4.10.2 初始代码
go
package main
import "fmt"
func main(){
fmt.Println("Hello World!")
}
1.5 - 测试用例
分 2 种形式
- 单变量
- 多类型与多变量
注:此节内容主要是给与出题老师在输入的示例值和程序中对应转换的参考,并非强制性 要求
1.5.1 - 单变量
TODO
1.5.2 - 多类型输入输出规则
- Java/JavaScript Node(12.18.2)/Python3(3.9) - 无类型
类型 | 输入 | 示例 | 输出 | 示例 |
---|---|---|---|---|
Int 整形 | int | 1 | int | 1 |
long 长整型 | long | 1 | long | 1 |
float 浮点型 | float | 1.00000 | float | 1.00000 |
double 浮点型 | double | 1.00000 | double | 1.00000 |
char 字符型 | char | a | char | a |
bool 布尔型 | boolean | true | boolean | true |
string 字符串 | String | "nowcoder" | String | "nowcoder" |
Interval 类 | Interval | [1,3] | Interval | [1,3] |
Point 类 | Point | (1,3) | Point | (1,3) |
ListNode 类 | ListNode | {1,3,4} | ListNode | {1,3,4} |
TreeNode 类 | TreeNode | {1,2,3#,#,4#,#,5} | TreeNode | {1,2,3#,#,4#,#,5} |
- Java/JavaScript Node(12.18.2)/Python3(3.9) - 一维数组
类型 | 输入 | 示例 | 输出 | 示例 |
---|---|---|---|---|
Int 整形 | int[] | [1,2] | int[] | [1,2] |
long 长整型 | long[] | [1,2] | long[] | [1,2] |
float 浮点型 | float[] | [1.00000,2.00000] | float[] | [1.00000,2.00000] |
double 浮点型 | double[] | [1.00000,2.00000] | double[] | [1.00000,2.00000] |
char 字符型 | char[] | [x,y] | char[] | [x,y] |
bool 布尔型 | boolean[] | [false,true] | boolean[] | [false,true] |
string 字符串 | String[] | ["nowcoder","best"] | String[] | ["nowcoder","best"] |
Interval 类 | Interval[] | [(2,5),(5,11)] | Interval[] | [(2,5),(5,11)] |
Point 类 | Point[] | [(2,5),(5,11)] | Point[] | [(2,5),(5,11)] |
ListNode 类 | ListNode[] | [{2,4,5},{5,6,7,89,11},{}] | ListNode[] | [{2,4,5},{5,6,7,89,11},{}] |
TreeNode 类 | TreeNode[] | [{1,2,3#,#,4#,#,5}] | TreeNode[] | [{1,2,3#,#,4#,#,5}] |
- Java/JavaScript Node(12.18.2)/Python3(3.9) - 二维数组
类型 | 输入 | 示例 | 输出 | 示例 |
---|---|---|---|---|
Int 整形 | int[][] | [[1,2,3],[4,5,6],[7,8,9]] | int[][] | [[1,2,3],[4,5,6,][7,8,9]] |
long 长整型 | long[][] | [[1,2,3],[4,5,6,][7,8,9]] | long[][] | [[1,2,3],[4,5,6,][7,8,9]] |
float 浮点型 | float[][] | [[1.00000,2.00000],[3.00000,4.00000]] | float[][] | [[1.00000,2.00000],[3.00000,4.00000]] |
double 浮点型 | double[][] | [[1.00000,2.00000],[3.00000,4.00000]] | double[][] | [[1.00000,2.00000],[3.00000,4.00000]] |
char 字符型 | char[][] | [[a,b],c,d]] | char[][] | [[a,b],c,d]] |
bool 布尔型 | boolean[][] | [[false,true],[true,false]] | boolean[][] | [[false,true],[true,false]] |
string 字符串 | String[][] | [["nowcoder","best"],["nowcoder","best"]] | String[][] | [["nowcoder","best"],["nowcoder","best"]] |
Interval 类 | Interval[][] | [[[2,5],[5,6]],[[4,5],[89,11]]] | Interval[][] | [[[2,5],[5,6]],[[4,5],[89,11]]] |
Point 类 | Point[][] | [[(2,5),(5,6)],[(4,5),(89,11)]] | Point[][] | [[(2,5),(5,6)],[(4,5),(89,11)]] |
ListNode 类 | ListNode[][] | [[{2,4,5},{5,6,7,89,11},{}],[{1,4,5},{5,6,7,89,11}]] | ListNode[][] | [[{2,4,5},{5,6,7,89,11},{}],[{1,4,5},{5,6,7,89,11}]] |
TreeNode 类 | TreeNode[][] | [[{1,2,3#,#,4#,#,5}],[{1,2,3#,#,4#,#,5},{1,2,3#,#,4... | TreeNode[][] | [[{1,2,3#,#,4#,#,5}],[{1,2,3#,#,4#,#,5},{1,2,3#,#,4... |
- Java - ArrayList
类型 | 输入 | 示例 | 输出 | 示例 |
---|---|---|---|---|
Int 整形 | ArrayList <Integer> | [1,2] | ArrayList<Integer | [1,2] |
long 长整型 | ArrayList <Long> | [1,2] | ArrayList<Long> | [1,2] |
float 浮点型 | ArrayList <Float> | [1.00000,2.00000] | ArrayList<Float> | [1.00000,2.00000] |
double 浮点型 | ArrayList <Double> | [1.00000,2.00000] | ArrayList<Double> | [1.00000,2.00000] |
char 字符型 | ArrayList <Character> | [x,y] | ArrayList<Character> | [x,y] |
bool 布尔型 | ArrayList <Boolean> | [false,true] | ArrayList<Boolean> | [false,true] |
string 字符串 | ArrayList <String> | ["nowcoder","best"] | ArrayList<String> | ["nowcoder","best"] |
Interval 类 | ArrayList <Interval> | [[2,5],[5,11]] | ArrayList<Interval> | [[2,5],[5,11]] |
Point 类 | ArrayList <Point> | [(2,5),(5,11)] | ArrayList<Point> | [(2,5),(5,11)] |
ListNode 类 | ArrayList <ListNode> | [{2,4,5},{5,6,7,89,11},{}] | ArrayList<ListNode> | [{2,4,5},{5,6,7,89,11},{}] |
TreeNode 类 | ArrayList <TreeNode> | [{1,2,3#,#,4#,#,5}] | ArrayList<TreeNode> | [{1,2,3#,#,4#,#,5}] |
2 - 出题地址
2.1 - 查看出题任务
获得权限后刷新 https://fuwu.jiker.com/ 会看到菜单 - 编程出题,点开即可看到出题需 求,搜索相关出题技能,点击“去出题”
2.2 - 查看我的出题
提交后可以在“编程题库出题 - 我的出题”列表里查看所有已提交的题目以及题目的审核状 态:
3 - 出题要求明细
3.1 - 题目信息
一道题目的设计需要包含以下三部分内容:
- 第一部分:题目设置。即题目前置信息,包含:题目来源、难度等级、题目分值、题目作 答时间、自动判题;
- 第二部分:题目内容。即题目本身,包含:时间限制、空间限制、题目标题、题目描述、 解析、初始代码(选填)、测试用例;
- 第三部分:题目验证。即验证当前编程题目能否通过全部测试用例,包含:单个测试用例 验证、多个测试用例验证。
3.2 - 第一部分:题目设置
即题目前置信息,包含:题目来源、难度等级、题目分值、题目作答时间、自动判题;
3.2.1 - 题目来源
一般老师出题选择:原创、网络或改编即可;(⚠️ 注:网络题目需要修改,避免版权问题 )
3.2.2 - 难度等级
题目难度分为:简单、普通、困难
| 难度 | 题目难度级别定义 |
---|
:---------------------------------------------------------------------------------------------------------------------------------------------------------- | | 简单:记忆型、概念型 | 以考察语法,执行流程,配置,记忆等元素组成的题目 ,不涉及底层逻辑或数据库,不涉及复杂的逻辑代码; | | 普通:理解 | 2 个以 上知识点的综合应用,不属于记忆性的题目,解决实际问题,综合知识的逻辑或者代码,如 :一个知识点+数据库 | | 困难:应用 | 框架整合、框架操作数据库、源码解读、 系统优化,多知识点融合,技术经验积累,经验判断,解决方案或者有一定挑战的编程等。 (可选取知识树标记为 R4 级别的知识点) |
知识点-题目难度对照参考图
根据技能点中知识点的内容,每个知识 点都会有记忆性的题目,理解性的题目,应用的题目。
- 有些知识点比较简单,适合出记忆性的题目,应用性题目偏少;
- 有些知识点难度比较高,适合出应用性的题目,记忆性出题就偏少;
3.2.3 - 题目分值
出题老师建议的题目的默认分值,根据实际使用场景有可能会用到此分值。区间为 1 ~ 10 分。
3.2.4 - 题目作答时间
当前题目的建议作答时间。限制学员在规定时间内完成作答,超时将自动判错。可根据题目 难度等实际情况灵活设置答题时间。默认分钟为单位,可切换秒为单位。
3.2.5 - 自动判题
启用:编程分析引擎将会自动分析用户多维度编程能力,适用于自动出分析结果的场景
禁用:编程分析引擎将不会自动分析用户编程能力,适用于不需要结果、单纯查看编程代 码的场景
3.3 - 第二部分:题目内容
即题目本身,包含:时间限制、空间限制、题目标题、题目描述、解析、初始代码(选填) 、测试用例;
3.3.0 - 查看方式
默认选择中文。
3.3.1 - 时间限制
指编译时间,一般 1-10 秒之间,有助于编程分析引擎对用户编程能力多维度的评估。
3.3.2 - 空间限制
指对代码运行的内存空间的要求,一般不超过 512M,有助于编程分析引擎对用户编程能力 多维度的评估。
3.3.3 - 题目标题
题目标题:清晰无歧义,无错别字,无超链接,不超过 100 字;
题干要求说明 | 示例 |
---|---|
如果题干是问句,使用“问号?”替代当前的() | |
3.3.4 - 题目描述
题目描述:
题目描述要求说明 | 示例 |
---|---|
可以包含文字、图片,代码 - 题目符合实效性(最新版本或主流版本) - 题目考察核心知识点,没有版本依赖 (不能是特定版本下才能得出正确答案) | 题目为主流版本,官方明确表示不维护的版本不能使用 例如:在 Java,Android 的代码中,禁止出现过时方法,如出现过时的方法 IDE 中显示如下: |
避免使用第二人称“你”“您”,客观描述,避免口语化表达; | 若需要使用第二人称“你”“您”,改为客观描述即可 修改为: |
无错别字 | |
有专有名词书写格式要按照官方规范写法 | 错误写法:postman mysql mongodb ,专有名词需要注意大小写; 正确写法:Postman、MySQL、MongoDB |
有序列表文字需要使用排序符号,提交之前要仔细查看预览效果 | |
图片:图片最多一张,要求清晰无水印,无 LOGO 标识,无版权问题; | |
注意:题目标题、描述和解析均使用 Markdown 语法编写,当前编辑器为 Markdown 编辑器; | Markdown 基本语法可以参考:https://commonmark.org/help/ |
3.3.5 - 解析
答案解析要求说明 | 示例 |
---|---|
答案解析:简洁明了,逻辑清晰,说明正确解题思路;用户答题完毕可以查看题目答案解析,帮助理解问题,如图: | |
3.3.6 - 初始代码(选填)
- 当前模块为非必填项。可根据当前题目需要,给用户一段初始代码交代背景,减少作答时 间。
- 若需要使用初始代码,则须考虑多种语言下的初始代码是否填写完整。
3.3.7 - 测试用例
- 请考虑多种极限值,并至少添加 2 组测试用例
- 测试用例有助于规避用户通过 print 输出内容绕过代码分析;
- 多个测试用例意味着标准答案不唯一,有助于多维检测用户编程能力;
- 支持单变量测试用例和多变量测试用例
- 【特殊情况】SQL 的测试用例为输入一段代码运行出表格,而非直接创建表格。
3.4 - 第三部分:题目验证
即验证当前编程题目能否通过全部测试用例,包含:单个测试用例验证、多个测试 用例验证。
注意:
- 当前模块为**验证部分,若要修改题目本身,请返回上一步修改。**
- 为了确保题目本身的逻辑正确,需要老师在题目验证这一步的代码框中作答,写出可 以使全部测试用例通过的代码后,点击一键验证。
- 当前部分也是出题的最后一步,在多种语言的全部测试用例都验证通过后,方可提交题 目。
3.4.1 - 单个测试用例验证
可以自定义输入单个输入,验证输出是否符合规则,同时验证代码是否正确。
3.4.2 - 多个测试用例验证
点击一键验证可直接验证全部测试用例,当全部测试用例验证通过后方可提交题目。
4 - 出题指导
主题 | 主题说明 |
---|---|
出题范围 | 按照技能点对应的知识树,聚焦知识树上的核心知识点设计出题范围 |
出题思路 | - 依据知识点思考它的出题纬度和场景,比如数组/List ,声明场景、下标读、下标写、下标删、弹出第一个,最后一个。。。 - 基于应用场景寻找有可能的出题点 - 基于实际功能代码段寻找可能的出题点 |
出题纬度 | 记忆: 纯记忆的题目,检查这个人是否知道相关概念,考察需要记忆都知识 映射:通过概念将其映射到实际的代码上,比如学习了类和实例,我们可以考察一行声明代码中哪个表达的是类,哪个是实例 模拟:大脑模拟计算机是怎么执行代码的,常用的考察方式是给一段代码,然后问输出是什么,这样的代码考察可以变换多种条件考察 解释:出现某种问题的时候,是否可以用知识解释原因 决策:面对应用场景,判断应该使用哪种方案来解决问题,这种通常要给一个非技术词汇描述的功能性需求或者一个较复杂的技术场景,然后提供一些方案供选择 |
出题难度级别 | 从常用角度区分: 不常用就是高难度,常用就是低难度,我们不能考一些偏僻但是不常用的知识点。从初级,中级,高级等不同职位常用的知识出发,可以作为划分难度的角度,类似的还有性能,内存,安全等质量维度划分难度; |
5 - 费用结算
提交题目并审核质检通过后,即可获得题目对应的价格报酬;「已拒绝」驳回的题目需修改 后重新提交,如果放弃修改则无法获得该题对应的报酬。
可以在「我的钱包」查看收支明细,以及进行提现操作。