最近在校招中经常遇到企业使用赛码网在线考试系统进行笔试,而在系统中我们的程序需要从标准输入(stdin,即“键盘”)读入,并输出到标准输出(stdout,即“屏幕”)。所以对此查看了其OJ说明文档并对使用方法进行了总结。
使用方法
1、输入API
本地环境需安装readline-sync同步获取用户通过键盘输入的值。npm install readline-sync
1.1、单行输入语法
本地:
//引入readline-sync模块
const read_line = require('readline-sync')
//获取用户通过键盘输入的值
let str = read_line.question("")
赛码系统:
let input = read_line()
//或者
while((line = read_line()) != ''){}
1.2、 多行输入
本地:
//引入readline-sync模块
const read_line = require('readline-sync')
// 读取输入行数
let n = read_line.question("")
// 循环 n 次
while (n--) {
// 读取每行输入的字符串
var input = read_line.question("")
....
}
赛码系统:
// 读取输入行数
let n = read_line( )
// 循环 n 次
while (n--) {
// 读取每行输入的字符串
var input = read_line( )
....
}
1.3、 数组
本地:
//引入readline-sync模块
const read_line = require('readline-sync')
let str = read_line.question("")
let arr = [];
arr = str.split(' ');
for (let i = 0; i < arr.length; i++) {
arr[i] = parseInt(arr[i])
}
赛码系统:
输入形式:
输入样例:
3
3 3 2
let len = read_line(); //获取第一个输入字符‘3’
let arr = []; //声明数组arr,来保存输入的数组
arr = read_line().split(' '); //获取第二行数据:'3' '3' '2', 使用split,以空格作为分隔将字符串转换为一个数组。['3', '3', '2']
for(let i = 0; i < arr.length; i++) {
arr[i] = parseInt(arr[i]); //将数组中的元素转换为数字
}
// arr就是最终需要获取的数组: [3,3,2]
1.4、没有给出矩阵的行列数
有些输入可能是:
输入一个矩阵,每行以空格分隔。
3 2 3
1 6 5
7 8 9
let arr = [];
let line;
while ((line = read_line()) != "") {
arr.push(line.split(' ').map(v=>parseInt(v)));
}
// 使用自测数据按钮时调试用,正式提交时要删掉。
for (let i=0; i<arr.length; i++) {
for (let j=0; j<arr[i].length; j++) {
printsth(arr[i][j], ' ');
}
print();
}
1.5、JS读取超长字符串
读取n个字符使用gets(n)。
将读取至多n个字符,当还未达到n个时如果遇到回车或结束符,会提前结束。回车符可能会包含在返回值中。
由于read_line()只能读取1024个字符,所以如果题目中的用例涉及到长度大于1024字符串的,需要用到gets(n)这个函数。
例如有这样一个题目,读取一个字符串,计算其长度。 备注:字符串的长度范围为1到10000; 代码一般这么写:
let line = gets(10000);
print(line.length);
如果测试用例长度刚好10000,则没有问题。 如果测试用例长度为小于10000,假设是100,则您的答案为101,错误。 因为gets(n)函数在遇到回车,或者第n个字符时,都会结束,但是如果是遇到回车结束的,则回车也会包含在返回值当中,所以,应该trim一下。
let line = gets(10000).trim();
print(line.length);
1.6、输入数组中带有中括号和逗号
有些输入可能是,输入一个矩阵:
[[3,2,3],
[1,6,5],
[7,8,9]]
对于这种没有给定矩阵行列数的输入,而且还包含中括号和逗号的输入,我们也是只能按照字符串拆分来进行。这里逗号和右中括号是关键。
let arr = [];
let line;
while ((line = read_line()) != "") {
arr.push(line.replace(/\]\,/g, "").replace(/ /g, "").replace(/\[/g, "").replace(/\]/g, "").split(",").map(v=>parseInt(v)));
}
// 使用自测数据按钮时调试用,正式提交时要删掉。
for (let i=0; i<arr.length; i++) {
for (let j=0; j<arr[i].length; j++) {
printsth(arr[i][j], ' ');
}
console.log('');
}
1.7、读取一个(长)整数
readInt();
1.8、读取一个浮点型
readDouble();
2、输出API
2.1、输出数组或矩阵
有些时候,出题人可能是直接用python进行的验题,输出二维数组时,是带有中括号和逗号的。输出已经拼好了中括号和逗号,但是,别的语言就没有这么幸运,需要自己拼凑这些。
[[1, 2, 3], [2, 3, 4]]
let arr = [[1,2,3],[4,5,6]]
console.log(arr.toString())
// 输出是:1,2,3,4,5,6
// 这样就错了,没有中括号
console.log(JSON.stringify(arr));
// 这样是对的
// 这样也是可以的
printsth('[');
for (let i=0; i<arr.length; i++) {
printsth('[');
printsth(arr[i].join(', '));
printsth(']');
if (i < arr.length - 1)
printsth(', ');
}
console.log(']');
2.2、不加回车的输出
往控制台输出sth,当有多个参数时,空格分隔;最后不加回车。
printsth(sth, ...);
2.3、带回车的输出
往控制台输出sth,当有多个参数时,空格分隔;最后加回车。
console.log(sth, ...)、print(sth, ...);
3、示例代码
实例一
var a, b;
var solveMeFirst = (a,b) => a+b;
while((a=readInt())!=null && (b=readInt())!=null){
let c = solveMeFirst(a, b);
console.log(c);
}
实例二
var line;
var solveMeFirst = (a,b) => a+b;
while((line = read_line()) != ''){
let arr = line.split(' ');
let a = parseInt(arr[0]);
let b = parseInt(arr[1]);
let c = solveMeFirst(a, b);
console.log(c);
}
总结
上述内容主要参考了赛码网OJ说明文档https://labfiles.acmcoder.com/ojhtml/index.html#/