牛客网在javascript V8引擎下处理输入输出如下:
利用了readline()接收输入的每一行,多行处理可以用多个readline()
输出函数用print()和console.log()都可以,多个输出会根据print个数在拆解,或者使用 print(results+’\n’); 拆行
题目描述
计算字符串最后一个单词的长度,单词以空格隔开。
输入描述:
一行字符串,非空,长度小于5000。
输出描述:
整数N,最后一个单词的长度。
示例1
输入
hello world
输出
5
var str = readline();
function lenOfLastWord(str) {
var arr = str.split(' '); // 将输入的字符串转换为数组
if(arr.length == 1) { //判断只有一个单词的情况
return arr[0].length;
}
var resLen = arr[arr.length-1].length; //获取最后一个单词的长度
return resLen;
}
console.log(lenOfLastWord(str));
题目描述
写出一个程序,接受一个由字母和数字组成的字符串,和一个字符,然后输出输入字符串中含有该字符的个数。不区分大小写。
输入描述:
第一行输入一个有字母和数字以及空格组成的字符串,第二行输入一个字符。
输出描述:
输出输入字符串中含有该字符的个数。
示例1
输入
ABCDEF
A
输出
1
var strNum = readline();
var c = readline();
function ContainNums(strNum,c) {
var resCount = 0;
strNum = strNum.toLowerCase(); // 不区分大小写,那我们就将其全部转换为小写
c = c.toLowerCase();
strNumArr = strNum.split(''); // 将字符串转为一个一个项组成的数组
for(var i = 0; i < strNumArr.length; i++) { // 循环新的数组并判断
if( strNumArr[i]==c )
resCount++;
}
return resCount;
}
console.log(ContainNums(strNum,c));
题目描述
明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤1000),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作(同一个测试用例里可能会有多组数据,希望大家能正确处理)。
Input Param
n 输入随机数的个数
inputArray n个随机整数组成的数组
Return Value
OutputArray 输出处理后的随机整数
注:测试用例保证输入参数的正确性,答题者无需验证。测试用例不止一组。
样例输入解释:
样例有两组测试
第一组是3个数字,分别是:2,2,1。
第二组是11个数字,分别是:10,20,40,32,67,40,20,89,300,400,15。
输入描述:
输入多行,先输入随机整数的个数,再输入相应个数的整数
输出描述:
返回多行,处理后的结果
// 注意审题,这里说的输入多行,然后再从每行中拆解出不同组的 个数+数组 的搭配
// 从示例1 中可以看出,有2组,第一组3个数,第二组11个数
while( line = readline() ) {
let arr = [];
for(let i = 0;i < line; i++) {
arr.push(readline()); //将某一组数据全部放入集合中
}
// 数组去重方式一
// let setArr = new Set(arr);
// 数组去重方式二,es6
let setArr = [...new Set(arr)];
let setSortArr = setArr.sort(function(a,b){
return a-b;
})
// 由于是单个单个地输出,所以这里不需要将数组转为字符串输出
for(let j = 0;j < setSortArr.length; j++) {
console.log(setSortArr[j]);
}
}
题目描述
•连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组;
•长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。
输入描述:
连续输入字符串(输入2次,每个字符串长度小于100)
输出描述:
输出到长度为8的新字符串数组
示例1
输入
abc
123456789
输出
abc00000
12345678
90000000
// 用同样的方法对两行进行一个判断长度是否超过8的判断代码量太大,先将两行加入一个数组
// 用 for 循环来对数组中两行进行处理
var arr = [];
for(let i = 0;i < 2;i++) {
arr.push(readline());
}
for(let j = 0; j < arr.length;j++) {
if(arr[j].length <= 8) {
var res = arr[j] + '00000000';
console.log(res.slice(0,8));
} else { //超过的可能会生成多行
let len = arr[j].length;
for(let m = 0; m < len; m+=8){
let resSlice = arr[j].slice(m,m+8);
if (resSlice.length < 8) {
let res = resSlice+'00000000';
console.log(res.slice(0,8)); //多余的零不会输出
} else {
console.log(resSlice);
}
}
}
}
功能:输入一个正整数,按照从小到大的顺序输出它的所有质因子(如180的质因子为2 2 3 3 5 )
最后一个数后面也要有空格
详细描述:
函数接口说明:
public String getResult(long ulDataInput)
输入参数:
long ulDataInput:输入的正整数
返回值:
String
输入描述:
输入一个long型整数
输出描述:
按照从小到大的顺序输出它的所有质数的因子,以空格隔开。最后一个数后面也要有空格。
示例1
输入
180
输出
2 2 3 3 5
// 质因数=质数+因数,即是质数,也要能被输入的数整除,我们可以从小开始查找
// 180 = 2x2x3x3x5
let num = readline();
let res = [];
for(let i = 2; i <= num; i++ ) {
if( num%i == 0 ) {
res.push(i); //将该质因数保存起来
num = num/i;
i = 1; //累加后等于2,又从2开始遍历
}
}
let res_sort = res.sort(function(a,b){
return a-b;
}).join(' ')+' '; //返回字符串,并在两个之间加空格,最后也要加空格
console.log(res_sort);
题目描述
写出一个程序,接受一个正浮点数值,输出该数值的近似整数值。如果小数点后数值大于等于5,向上取整;小于5,则向下取整。
输入描述:
输入一个正浮点数值
输出描述:
输出该数值的近似整数值
示例1
输入
5.5
输出
6
let num = readline();
let nums = num.toString().split('.'); //将数字先转成字符串,然后按小数点分成两部分,右边为要判断的数
if(nums[1]>=5) {
nums[0]++;
console.log(nums[0]);
} else {
console.log(nums[0]);
}
题目描述
数据表记录包含表索引和数值(int范围的整数),请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照key值升序进行输出。
输入描述:
先输入键值对的个数
然后输入成对的index和value值,以空格隔开
输出描述:
输出合并后的键值对(多行)
示例1
输入
4
0 1
0 2
1 2
3 4
输出
0 3
1 2
3 4
let keyNum = readline();
let keyMap = {};
for(let i = 0; i < keyNum; i++) {
// let kv = readline(); //这里不能直接读取进来后得到数组
let kv = readline().split(' ').map(function(item){
return parseInt(item); //转换成正整数
}); // map对数组的每个元素都遍历一次,同时返回一个新的值
if(keyMap[kv[0]]) {
keyMap[kv[0]] += kv[1];
} else {
keyMap[kv[0]] = kv[1];
}
}
//下面几种遍历方法都试过,但是都有问题
// map遍历方法
/*
map.forEach(function(value,key){
console.log(value,key);
});
for(let item of map){};
for(let item of map.values()){};
for(let item of map.keys()){};
*/
// 这里使用 Object.keys() 方法,可以返回对象的 key 值为一个数组,也可以返回字符串/数组的 索引值
let res = Object.keys(keyMap);
for(let j = 0; j < res.length; j++) {
console.log(res[j]+' '+keyMap[res[j]]);
}
题目描述
输入一个int型整数,按照从右向左的阅读顺序,返回一个不含重复数字的新的整数。
输入描述:
输入一个int型整数
输出描述:
按照从右向左的阅读顺序,返回一个不含重复数字的新的整数
示例1
输入
9876673
输出
37689
let num_str = readline();
//调用split得到字符数组,再直接调用翻转函数
let num_rev = num_str.split('').reverse(); //reverse用于数组,num-rev为逆转后的字符数组
let res = [];
for(let i = 0; i < num_rev.length; i++) {
if( res.indexOf(num_rev[i]) == -1)
res.push(num_rev[i]);
}
// res为包含逗号的反转后的字符串,join用于数组放入一个字符串中,默认逗号连接
console.log(res.toString().replace(/,/g,''));
题目描述
编写一个函数,计算字符串中含有的不同字符的个数。字符在ACSII码范围内(0~127),换行表示结束符,不算在字符里。不在范围内的不作统计。
输入描述:
输入N个字符,字符在ACSII码范围内。
输出描述:
输出范围在(0~127)字符的个数。
示例1
输入
abc
输出
3
// charCodeAt() //将字符转为 ascall 码
// formCharCode //将 ascall转为字符,单个转
let str = readline();
let strArr = str.split(''); //需要将连续字符转为字符去重
let strSet = [];
let count = 0;
for(let i = 0; i < strArr.length; i++) { // 循环遍历,去重
if( strSet.indexOf(strArr[i]) == -1) {
strSet.push(strArr[i]);
}
}
for(let i =0; i < strSet.length; i++) { // 遍历去重后的数组,判断转换后的 ascall 是否小于 127
if (strSet[i].charCodeAt() <= 127)
count++;
}
console.log(count);
题目描述
描述:
输入一个整数,将这个整数以字符串的形式逆序输出
程序不考虑负数的情况,若数字含有0,则逆序形式也含有0,如输入为100,则输出为001
输入描述:
输入一个int整数
输出描述:
将这个整数以字符串的形式逆序输出
示例1
输入
1516000
输出
0006151
let num = readline();
let str = num.split('').reverse(); // 转为字符数组
console.log(str.toString().replace(/,/g,''));
语法:
/正则表达式主体/修饰符(可选)
在 JavaScript 中,正则表达式通常用于两个字符串方法 : search() 和 replace()。
正则表达式修饰符:
i 执行对大小写不敏感的匹配。
g 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。
m 执行多行匹配。
正则表达式模式:
[abc] 查找方括号之间的任何字符。
[0-9] 查找任何从 0 至 9 的数字。
(x|y) 查找任何以 | 分隔的选项。
元字符是拥有特殊含义的字符:
元字符 描述
\d 查找数字。
\s 查找空白字符。
\b 匹配单词边界。
\uxxxx 查找以十六进制数 xxxx 规定的 Unicode 字符
量词:
量词 描述
n+ 匹配任何包含至少一个 n 的字符串。
n* 匹配任何包含零个或多个 n 的字符串。
n? 匹配任何包含零个或一个 n 的字符串。
特殊字符:
$:匹配输入字符串的结尾
^:匹配输入字符串的开始
| :指明两项之间的选择
限定符:
使用 RegExp 对象:
在 JavaScript 中,RegExp 对象是一个预定义了属性和方法的正则表达式对象。
test() 方法是一个正则表达式方法。
test() 方法用于检测一个字符串是否匹配某个模式,如果字符串中含有匹配的文本,则返回 true,否则返回 false。
以下实例用于搜索字符串中的字符 “e”:
var patt = /e/; patt.test("The best things in life are free!");
你可以不用设置正则表达式的变量,以上两行代码可以合并为一行:
/e/.test("The best things in life are free!")
使用 exec()
exec() 方法是一个正则表达式方法。
exec() 方法用于检索字符串中的正则表达式的匹配。
该函数返回一个数组,其中存放匹配的结果。如果未找到匹配,则返回值为 null。
/e/.exec("The best things in life are free!");
字符串中含有 “e”,所以该实例输出为:
e
例子:判断字符串是否全部为字母
val = "123456"
var isletter = /^[a-zA-Z]+$/.test(val);
判断是否全为数字
val = "123456"
var isnum = /^\d+$/.test(val);
题目描述
写出一个程序,接受一个字符串,然后输出该字符串反转后的字符串。(字符串长度不超过1000)
输入描述:
输入N个字符
输出描述:
输出该字符串反转后的字符串
示例1
输入
abcd
输出
dcba
let str = readline();
let strRev = str.split('').reverse();
console.log(strRev.toString().replace(/,/g,'')); //结果还是要先转成字符串的形式
题目描述
将一个英文语句以单词为单位逆序排放。例如“I am a boy”,逆序排放后为“boy a am I”
所有单词之间用一个空格隔开,语句中除了英文字母外,不再包含其他字符
输入描述:
将一个英文语句以单词为单位逆序排放。
输出描述:
得到逆序的句子
示例1
输入
I am a boy
输出
boy a am I
let str = readline();
let sentence = str.split(' '); //通过空格分割字符
let res = [];
for(let i = sentence.length-1; i >= 0; i--) {
res.push(sentence[i]); //将句子内容按照单词逆序存入res
}
// res = ["boy","a","am","I"];
// res.toString() = [boy,a,am,I]
// 最后用正则表达式将 逗号换成 空格
console.log(res.toString().replace(/,/g,' '));
题目描述
给定n个字符串,请对n个字符串按照字典序排列。
输入描述:
输入第一行为一个正整数n(1≤n≤1000),下面n行为n个字符串(字符串长度≤100),字符串中只含有大小写字母。
输出描述:
数据输出n行,输出结果为按照字典序排列的字符串。
示例1
输入
3
cap
to
cat
输出
cap
cat
to
let num = readline();
let str = [];
for(let i = 0; i < num; i++) {
str.push(readline());
}
res = str.sort(); //直接利用 sort 可以对字符串按照字典序排序
for(let j = 0; j < res.length; j++){
console.log(res[j]);
}
题目描述
输入一个int型的正整数,计算出该int型数据在内存中存储时1的个数。
输入描述:
输入一个整数(int类型)
输出描述:
这个数转换成2进制后,输出1的个数
示例1
输入
5
输出
2
let num = parseInt(readline()); // 需要将输入的转为int型数字
let bit = num.toString(2).split(''); // 转为2进制字符,再转为字符数组
let count = 0; // 统计1的个数
for(let i = 0; i < bit.length; i++) {
if( bit[i] == '1') {
count++;
}
}
console.log(count);