OJ (Online Judge)使用
这是一种方式,我们还可使用另外一种方式:
process.stdin.resume();
process.stdin.setEncoding('ascii'); var input = "";
var input_array = ""; process.stdin.on('data', function (data) {
input += data;
}); process.stdin.on('end', function () { input_array = input.split("\n");
var str = input_array[];
console.log(str.split(' ').reverse().join(' '));
});
这种方式比之前的那种方式会更好一些! 即data事件的时候,我们一直处于接受数据的时候,然后一旦触发了 end 事件,说明我们这次的输入结束。 然后呢, 得到的 input_array就是输入的所有行,我们直接使用就可以了。
其实,我们可以知道牛客网的方式应该是每次测试用例每次就调用函数。
说明: 后者为什么好呢? 因为通过后者,我们可以准确地判断出来到底什么时候结束,而前者在某些情况下,我们是无法判断函数是何时结束的,如下所示:
如果我们不用后者这种方式,那么我们就没有办法确定一共有多少个case,就没法做这道题了。
最终ac的代码如下所示:
process.stdin.resume();
process.stdin.setEncoding('ascii'); var input = "";
var input_array = ''; process.stdin.on('data', function (data) {
input += data;
}); process.stdin.on('end', function () {
// 目前的这个input_array就是输入的所有行,我们现在的目的就是如果把这两个case放在一个一个数组中。
input_array = input.split("\n");
var nLine = ; var hhh = []; while(nLine < input_array.length){
var line = input_array[nLine++].trim();
// 这一句非常关键,有了这一句,因为有时候,这个没有处理好,可能输入就会出现问题。
if(line === ''){
continue;
}
// 这种方式我们就可以把输入的所有行通过 hhh 这个数组来拿到了。
hhh.push(line);
} var arr = []; for (var i = ; i < hhh.length; i++) {
// 当输入是一个数字的时候,就是M或者是N 下面的isNaN(Number(hhh[i]))的判断非常重要,通过这一句,我们就可以很轻松地来分类了 。
if (!isNaN(Number(hhh[i]))) {
arr.push(hhh.slice(i + , i + Number(hhh[i]) + ));
}
}
// 循环之后,得到的数组就是一个二维数组,一定是偶数个,比如arr数组的第一个元素就是['aaa', 'aaa', 'baa'], 那么arr的第二个元素就是 ['aa', 'ba'] var result = []; // 创建一个用于最后输出的元素的数组,最终遍历输出即可。
for (var j = ; j < arr.length; j++) {
if (j % == ) {
for (var k = ; k < arr[j + ].length; k++) {
var count = ;
for (var m = ; m < arr[j].length; m++) {
// 这里也很巧妙,就是对于一个字符串是否是另一个字符串的子串,我们可以通过 indexOf 的方式来解决,这样就不需要耗时的遍历的方法或者使用复杂的KMP算法了。
if (arr[j][m].indexOf(arr[j + ][k]) != (-)) {
count++;
}
}
result.push(count);
}
}
} for (var n = ; n < result.length; n++) {
console.log(result[n]);
}
});
第一部分:
1. 360、完美世界等使用的编程环境(OJ系统)
http://oj.acmcoder.com/ExamNotice.html 对于OJ系统进行了说明。
http://oj.acmcoder.com/QA/ 常见问题
下面的代码输出的是a+b, line是用于输入的。
var line;
while(line = read_line()){
line = line.split(' ');
print(parseInt(line[]) + parseInt(line[]));
}
下面是一个成功运行的题目,如下:
注意的几个地方:
- read_line() 得到的是输入的字符串,如 "81 4"
- 显然,通过read_line().split(" ")得到的是一个字符串数组(注意: split(" ")中有一个空格),所以如果我们希望使用数字,就应该Number转换一下
- print()就相当于console.log(somethin); 再加一个<br/>(换行)。
- 最好使用上述固定的格式: 即在while循环内调用函数,在调用的函数里输出。
- 对于本题而言,应当注意 toFixed() 是用在最后, 这才是最精确的。
下面的是将输出使用空格分开,我最后的正确率是88%,不知道具体错在了哪里...
2.网易使用的编程环境(牛客网提供OJ系统)
https://www.nowcoder.com/discuss/276
https://www.nowcoder.com/test/question/0147cbd790724bc9ae0b779aaf7c5b50?pid=2811407&tid=7485771 和网易的题是类似的
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[]) + parseInt(tokens[]));
});
第一句是指引入了readline文件,第二句是指设定rl的输入输出为标准输入输出。第三句的意思就是输入为line的函数,第四句的意思就是将输入以空格分为数组。 第五句就是使用console.log()输出。
它的测试方法是,输入大量的数据进行测试,并不是说只要有一个成立就行,而是所有的情况都成立才可以。
对于单行输入,使用下面的方法:
即引入readline模块,然后使用createInterface创建接口,接着使用on监听line事件。 对于多行输入的,我们可以用一个数组接受多行,等到满足了长度,就执行主要的函数。
var readline = require('readline'); var rl = readline.createInterface({
input: process.stdin,
output: process.stdout
}); rl.on('line', function (line) {
var str = line;
var obj = {}; for (var i = , len = str.length; i < len; i++) {
if (!obj[str[i]]) {
obj[str[i]] = ;
}
}
var count = ;
for (var key in obj) {
count++
} switch (count) {
case :
console.log();
break;
case :
console.log();
break;
default:
console.log();
return; } });
下面是一个多行输入的题目,题目如下:
解答过程如下:
var readline = require('readline');
var rl = readline.createInterface({
input: process.stdin,
output: process.stdout
}); var inputArr = []; rl.on('line', function (line) {
inputArr.push(line.trim());
if (inputArr.length == ) {
var number = parseInt(inputArr[]);
var arr = inputArr[].split(' ');
// 首先将数组由小到大进行排列,这样,d只可能是0或者正数。
arr.sort(function (a, b) {
return a - b;
}); var diff = []; for (var i = , len = arr.length; i < len - ; i++) {
diff.push(arr[i + ] - arr[i]);
} var flag = true;
for (var j = , jLen = diff.length; j < jLen - ; j++) {
if (diff[j + ] !== diff[j]) {
flag = false;
break;
}
} if (flag) {
console.log('Possible')
} else {
console.log('Impossible');
}
}
});
即在readline.on('line', function (line) {})函数中使用inputArr.length来判断是否等于输入的行数,等于的时候,再执行主要逻辑。
看到了下面这种方式,其实也是蛮不错的:
即处理好输入之后,调用一个函数,这样,我们在本地调试的时候,直接copy这个函数过去就可以了, 非常清楚明了。
3.牛客网上的剑指offer方法又略有不同:(OJ系统)
例: 这里实现的是将一个字符串中的空格使用%20替换。
function replaceSpace(str)
{
// write code here
}
module.exports = {
replaceSpace : replaceSpace
};
这里最后只要在函数内return 出希望返回的值即可。
第二部分: 答题需要的基本知识
http://nodejs.cn/api/readline.html#readline_class_interface
一、nodejs中readline模块的使用
一般,我们在使用系统进行答题时,都是需要使用readline模块的,这个模块可以进行读取行,然后就可以由系统进行检测了。
readline模块一般有一个interface类,这个类对应了一些事件和方法。readline还有一些其他的方法,但是最重要的还是interface类,下面我们简单的讲解、学习。
require('readline')
模块提供了一个接口,用于从可读流(如 process.stdin
)读取数据,每次读取一行。 它可以通过以下方式使用:
const readline = require('readline')
例子,readline
模块的基本用法:
const readline = require('readline')
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
})
rl.question('你认为nodejs怎么样?', (answer) => {
//对answer进行处理
console.log(`多谢你的反馈:${answer}`);
rl.close();
})
如下所示:
可以看到: 我们首先引入了readline模块,然后创建了接口类,接着,我们调用了接口的question方法,第一个参数是一个字符串,第二个是回调函数,参数就是在命令行中输入的,我们可以对之进行操作。
最后,我们必须使用rl.close()来关闭,否则,node程序不会自动关闭。
Interface类
readline.Interface
类的实例是使用 readline.createInterface()
方法构造的。 每个实例都关联一个 input
可读流和一个 output
可写流。 output
流用于为到达的用户输入打印提示,且从 input
流读取。
'close' 事件
当以下之一发生时,触发 'close'
事件:
rl.close()
方法被调用,且readline.Interface
实例已撤回对input
流和output
流的控制;input
流接收到'end'
事件;input
流接收到表示结束传输的<ctrl>-D
;input
流接收到表示SIGINT
的<ctrl>-C
,且readline.Interface
实例上没有注册SIGINT
事件监听器。
监听器函数被调用时不传入任何参数。
当 'close'
事件被触发时,readline.Interface
实例应当被视为已结束。
'line' 事件
每当 input
流接收到接收行结束符(\n
、\r
或 \r\n
)时触发 'line'
事件。 通常发生在用户按下 <Enter>
键或 <Return>
键。
监听器函数被调用时会带上一个包含接收的那一行输入的字符串。
rl.on('line', (input) => {
console.log(`接收到:${input}`);
});
即用户按下了回车时就会触发line事件,然后,我们就可以使用一个回调函数就收到输入。
'pause' 事件
当以下之一发生时触发 'pause'
事件:
监听器函数被调用时不传入任何参数。
'resume' 事件
每当 input
流被恢复时触发 'resume'
事件。
监听器函数被调用时不传入任何参数。
例子:
rl.on('resume', () => {
console.log('Readline 被恢复。');
});
'SIGCONT' 事件
当一个 Node.js 进程使用 <ctrl>-Z
(也就是 SIGTSTP
)移入后台之后再使用 fg(1p) 移回前台时,触发 'SIGCONT'
事件。
如果 input
流在 SIGTSTP
请求之前被暂停,则事件不会被触发。
监听器函数被调用时不传入任何参数。
例子:
rl.on('SIGCONT', () => {
// `prompt` 会自动恢复流
rl.prompt();
});
rl.close()
rl.close()
方法会关闭 readline.Interface
实例,且撤回对 input
和 output
流的控制。 但被调用时,'close'
事件会被触发。
rl.promp
rl.prompt()
方法会在 output
流中新的一行写入 readline.Interface
实例配置后的 prompt
,用于为用户提供一个可供输入的新的位置。
当被调用时,如果 input
流已被暂停,则 rl.prompt()
会恢复 input
流。
如果 readline.Interface
被创建时 output
被设为 null
或 undefined
,则提示不会被写入。
rl.pause()
rl.pause()
方法会暂停 input
流,且稍后需要时可被恢复。
调用 rl.pause()
不会立刻暂停其他事件(包括 'line'
)被 readline.Interface
实例触发。
rl.question(query, callback)
query
<string> 一个在提示符之前、要写入output
的叙述或询问。callback
<Function> 一个回调函数,它会被调用并带上用户响应query
的输入。
rl.question()
方法通过写入到 output
来展示 query
,并等待用户提供到 input
的输入,然后调用 callback
函数并传入提供的输入作为第一个参数。
rl.question('你最喜欢的食物是什么? ', (answer) => {
console.log(`你最喜欢的食物是 ${answer}`);
});
rl.resume()
如果 input
流已被暂停,则 rl.resume()
方法会恢复 input
流。
readline.createInterface(options)
简单的命令行界面
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
prompt: '请输入> '
}); rl.prompt(); rl.on('line', (line) => {
switch (line.trim()) {
case 'hello':
console.log('world!');
break;
default:
console.log(`你输入的是:'${line.trim()}'`);
break;
}
rl.prompt();
}).on('close', () => {
console.log('再见!');
process.exit();
});
例子:逐行地读取文件流
const readline = require('readline');
const fs = require('fs'); const rl = readline.createInterface({
input: fs.createReadStream('sample.txt')
}); rl.on('line', (line) => {
console.log(`文件的单行内容:${line}`);
});
OJ (Online Judge)使用的更多相关文章
- 详解OJ(Online Judge)中PHP代码的提交方法及要点【举例:ZOJ 1001 (A + B Problem)】
详解OJ(Online Judge)中PHP代码的提交方法及要点 Introduction of How to submit PHP code to Online Judge Systems Int ...
- OJ(Online Judge)
OJ:它是Online Judge系统的简称,用来在线检测程序源代码的正确性.著名的OJ有RQNOJ.URAL等.国内著名的题库有北京大学题库.浙江大学题库等.国外的题库包括乌拉尔大学.瓦拉杜利德大学 ...
- CSU OJ 1340 A Sample Problem
Description My girlfriend loves 7 very much, she thinks it is lucky! If an integer contains one or m ...
- OJ大集合、
转载自:传送门 什么是OJ Online Judge系统(简称OJ)是一个在线的判题系统.用户可以在线提交程序源代码,系统对源代码进行编译和执行,并通过预先设计的测试数据来检验程序源代码的正确性. 一 ...
- c#的dllimport使用方法详解,调试找不到dll的方法
DllImport会按照顺序自动去寻找的地方: 1.exe所在目录 2.System32目录 3.环境变量目录所以只需要你把引用的DLL 拷贝到这三个目录下 就可以不用写路径了 或者可以这样serve ...
- C# DllImport用法和路径问题
DllImport是System.Runtime.InteropServices命名空间下的一个属性类,其功能是提供从非托管DLL导出的函数的必要调用信息. DllImport属性应用于方法,要 ...
- C#中DllImport用法和路径问题
DllImport是System.Runtime.InteropServices命名空间下的一个属性类,其功能是提供从非托管DLL导出的函数的必要调用信息. DllImport属性应用于方法,要 ...
- OnlineJudge大集合
什么是OJ Online Judge系统(简称OJ)是一个在线的判题系统.用户可以在线提交程序源代码,系统对源代码进行编译和执行,并通过预先设计的测试数据来检验程序源代码的正确性. 一个用户提交的程序 ...
- .Net中C#的DllImport的用法
大家在实际工作学习C#的时候,可能会问:为什么我们要为一些已经存在的功能(比如 Windows中的一些功能,C++中已经编写好的一些方法)要重新编写代码,C#有没有方法可以直接都用这些原本已经存在的功 ...
- 【转帖】.Net中C#的DllImport的用法
在 C# 中通过 P/Invoke 调用Win32 DLL http://msdn.microsoft.com/zh-cn/library/aa686045.aspx 大家在实际工作学习C#的时候 ...
随机推荐
- 分组背包----HDU1712 ACboy needs your help
很简单的一道分组背包入门问题.不多解释了. #include <iostream> #include <cstdio> #include <cstring> usi ...
- 使用"*"通配符来选择文件
Include 方法和IncludeDirectory 方法中的搜索模式中指定的虚拟路径可以接受一个"*"通配符字符作为前缀或后缀,以在最后一个路径段.搜索字符串是大小写不敏感的. ...
- Http报头中不能添加中文字符
今逢一Bug,如下: Invalid non-ASCII or control character in header: 0x6D4B 大意为:报头中有非法字符.故可将其编码后,set入Header, ...
- The 'microsoft.jet.oledb.4.0' provider is not registered on the local machin
1,2选取目标站点,然后3的高级设置,4启用32位的应用程序的属性变为true就可以了.当然,网络上还有其他的版本,你也可以尝试下. 原文地址:http://weblogs.asp.net/kenco ...
- 重拾C,一天一点点_7
标准库,atof()函数包含在头文件<stdlib.h>中 /******把字符串s转换为相应的双精度浮点数*******/ #include <stdio.h> #inclu ...
- BZOJ4650/UOJ219 [Noi2016]优秀的拆分
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- 图层锁定vlisp函数高版本图元自动淡色显示
(defun c:tt(/ obj) (sk_layerLock (getvar "clayer") nil) (princ) ) ;;;name:sk_layerLock ;;; ...
- Python实现——二次多项式回归(最小二乘法)
2019/3/25 真的,当那个图像出现的时候,我真的感觉太美了. 或许是一路上以来自我的摸索加深的我对于这个模型的感受吧. 二次函数拟合--最小二乘法公式法 与线性回归相似,对二次函数进行拟合某种意 ...
- Python元类__prepare__方法深入理解
学习元类的时候,对__prepare__不是很理解,书上讲解的也不是很详细,最后通过查看stackoverflow的一些帖子对该方法有了一些理解,记录如下: 先看代码: class member_ta ...
- [APIO2009]抢掠计划 tarjan缩点+spfa BZOJ1179
题目描述 Siruseri 城中的道路都是单向的.不同的道路由路口连接.按照法律的规定, 在每个路口都设立了一个 Siruseri 银行的 ATM 取款机.令人奇怪的是,Siruseri 的酒吧也都设 ...