总结使用JavaScript在赛码网编写算法的输入/输出

最近在校招中经常遇到企业使用赛码网在线考试系统进行笔试,而在系统中我们的程序需要从标准输入(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#/

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值