最近在牛客网刷华为机试题,遇到了很多坑,记录:

每一道题目都经过自己实践验证

华为机试题

牛客网在javascript V8引擎下处理输入输出如下:
利用了readline()接收输入的每一行,多行处理可以用多个readline()
输出函数用print()和console.log()都可以,多个输出会根据print个数在拆解,或者使用 print(results+’\n’); 拆行

目录

华为机试题


1. 字符串最后一个单词的长度

题目描述
计算字符串最后一个单词的长度,单词以空格隔开。
输入描述:
一行字符串,非空,长度小于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));

2. 计算字符个数

题目描述
写出一个程序,接受一个由字母和数字组成的字符串,和一个字符,然后输出输入字符串中含有该字符的个数。不区分大小写。
输入描述:
第一行输入一个有字母和数字以及空格组成的字符串,第二行输入一个字符。
输出描述:
输出输入字符串中含有该字符的个数。

示例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));

3. 明明的随机数
题目描述
明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了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);// 数组去重方式二,es6let 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]);}
}

4. 字符串分隔

题目描述
•连续输入字符串,请按长度为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);}}}
}

5. 质数因子题目描述

功能:输入一个正整数,按照从小到大的顺序输出它的所有质因子(如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);

6. 取近似值

题目描述
写出一个程序,接受一个正浮点数值,输出该数值的近似整数值。如果小数点后数值大于等于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]);
}

7. 合并表记录
题目描述
数据表记录包含表索引和数值(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]]);
}

8. 提取不重复的整数

题目描述
输入一个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,''));

9. 字符个数统计

题目描述
编写一个函数,计算字符串中含有的不同字符的个数。字符在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 是否小于 127if (strSet[i].charCodeAt() <= 127) count++;
}
console.log(count);

10. 数字颠倒

题目描述
描述:

输入一个整数,将这个整数以字符串的形式逆序输出

程序不考虑负数的情况,若数字含有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 的字符串。

runoo+b,可以匹配 runoob、runooob、runoooooob 等,+ 号代表前面的字符必须至少出现一次(1次或多次)。
runoob,可以匹配 runob、runoob、runoooooob 等, 号代表字符可以不出现,也可以出现一次或者多次(0次、或1次、或多次)。
colou?r 可以匹配 color 或者 colour,? 问号代表前面的字符最多只可以出现一次(0次、或1次)
特殊字符:
$:匹配输入字符串的结尾
^:匹配输入字符串的开始
| :指明两项之间的选择

限定符:

{n} n 是一个非负整数。匹配确定的 n 次。例如,‘o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o。
{n,} n 是一个非负整数。至少匹配n 次。例如,‘o{2,}’ 不能匹配 “Bob” 中的 ‘o’,但能匹配 “foooood” 中的所有 o。‘o{1,}’ 等价于 ‘o+’。‘o{0,}’ 则等价于 ‘o*’。
{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,“o{1,3}” 将匹配 “fooooood” 中的前三个 o。‘o{0,1}’ 等价于 ‘o?’。请注意在逗号和两个数之间不能有空格。
使用 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);

11. 字符串反转

题目描述
写出一个程序,接受一个字符串,然后输出该字符串反转后的字符串。(字符串长度不超过1000)

输入描述:
输入N个字符
输出描述:
输出该字符串反转后的字符串

示例1
输入
abcd
输出
dcba

let str = readline();
let strRev = str.split('').reverse();
console.log(strRev.toString().replace(/,/g,''));  //结果还是要先转成字符串的形式

12. 句子逆序

题目描述
将一个英文语句以单词为单位逆序排放。例如“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,' '));

13. 字串的连接最长路径查找

题目描述
给定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]);
}

14. 求int型正整数在内存中存储时1的个数

题目描述
输入一个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);

16.坐标移动

题目描述
开发一个坐标计算工具, A表示向左移动,D表示向右移动,W表示向上移动,S表示向下移动。从(0,0)点开始移动,从输入字符串里面读取一些坐标,并将最终输入结果输出到输出文件里面。
输入:
合法坐标为A(或者D或者W或者S) + 数字(两位以内)
坐标之间以;分隔。
非法坐标点需要进行丢弃。如AA10; A1A; ; YAD; 等。
下面是一个简单的例子 如:
A10;S20;W10;D30;X;A1A;B10A11;;A10;
处理过程:
起点(0,0)
+ A10 = (-10,0)
+ S20 = (-10,-20)
+ W10 = (-10,-10)
+ D30 = (20,-10)
+ + x = 无效
+ A1A = 无效
+ B10A11 = 无效
+ 一个空 不影响
+ A10 = (10,-10)
+ 结果 (10, -10)
输入描述:
一行字符串
输出描述:
最终坐标,以,分隔

while(line=readline()){var Arr=line.split(";");var x=0;
var y=0;
var tl=0;
var tr=0;
var td=0;
var tu=0;
var Arr2=[]
var reg=/^[ADWS]\d+$/;
for(var i in Arr){if(reg.test(Arr[i])){Arr2.push(Arr[i]);      }
}
for(var i in Arr2){if(Arr2[i][0]=='A'){var xl=-parseInt(Arr2[i].slice(1,Arr2[i].length));tl+=xl;}if(Arr2[i][0]=='D'){var xr=parseInt(Arr2[i].slice(1,Arr2[i].length));tr+=xr;}if(Arr2[i][0]=='S'){var yd=-parseInt(Arr2[i].slice(1,Arr2[i].length));td+=yd}if(Arr2[i][0]=='W'){var yu=parseInt(Arr2[i].slice(1,Arr2[i].length));tu+=yu;}       }x=tl+tr;
y=td+tu;
console.log(x+','+y);}

参考文章:

1.牛客网华为机试题(JavaScript)--https://blog.csdn.net/qq_25481047/article/details/104543214?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

2.用JS在牛客网华为机试上碰到的一些坑---https://blog.csdn.net/sinat_28839863/article/details/89955332

牛客网华为机试题(JavaScript)相关推荐

  1. 华为机试python编程题_牛客网华为机试题之Python解法

    牛客网华为机试题之Python解法 第1题 字符串最后一个单词的长度 a = input().split(" ") print(len(a[-1])) 第2题 计算字符个数 a = ...

  2. C++实现_数据分类处理(牛客网华为机试题)

    目录: 题目描述 输入描述: 输出描述: 示例: 题意理解 C++代码: 参考文章: 题目描述 信息社会,有海量的数据需要分析处理,比如公安局分析身份证号码. QQ 用户.手机号码.银行帐号等信息及活 ...

  3. 【牛客网-华为机试题目录】持续更新中

    文章目录 博主精品专栏导航 华为机试题:HJ80 整型数组合并(python) 华为机试题:HJ76 尼科彻斯定理(python) 华为机试题:HJ73 计算日期到天数转换(python) 华为机试题 ...

  4. 牛客网 华为机试题 数据重复的筛选问题记录

    题目描述 输入一个int型整数,按照从右向左的阅读顺序,返回一个不含重复数字的新的整数. 保证输入的整数最后一位不是0. 输入描述: 输入一个int型整数 输出描述: 按照从右向左的阅读顺序,返回一个 ...

  5. 牛客网华为机试题 字符串问题 记录

    一.题目描述 写出一个程序,接受一个由字母.数字和空格组成的字符串,和一个字母,然后输出输入字符串中该字母的出现次数.不区分大小写. 输入描述: 第一行输入一个由字母和数字以及空格组成的字符串,第二行 ...

  6. 牛客网华为机试 JavaScript V8(一小部分)

    HJ6 质数因子 let num = parseInt(readline()) let arr = [] for (let i=2; i*i<=num; i++) { // 使用 i*i 判断可 ...

  7. (牛客网)华为机试(二)

    (牛客网)华为机试题集解答 在解题前先分享一波oj刷题的固定格式代码,方便输入时使用 import java.util.*; import java.io.*; public class Main{ ...

  8. JavsScript牛客网华为机试(11-20)题解

    牛客网华为机试题解JavaScript版本 华为机试第11-20题解答(js) 11.数字颠倒 12.字符串反转 13.句子逆序 14.字符串排序 15.求int型数据在内存中存储时1的个数 16.购 ...

  9. 牛客网--华为机试在线训练10:字符个数统计

    牛客网–华为机试在线训练10:字符个数统计 题目描述 编写一个函数,计算字符串中含有的不同字符的个数.字符在ACSII码范围内(0~127).不在范围内的不作统计. 输入描述: 输入N个字符,字符在A ...

最新文章

  1. 什么是UUID及其实现代码
  2. 昔日“东方神童”逝世,4岁读完初中课程,17岁中科院硕博连读,网友:湖南华容的传说...
  3. mysql proxy 读写分离 1
  4. Windows I/O模型、同步/异步、阻塞/非阻塞
  5. 前端学习(1398):多人管理18项目重定向
  6. Qt之QMessageBox详解
  7. java+jdk+1.6.0+45+64_jdk1.6.0_45.tar.gz
  8. 2021华为软挑赛题_思路分析——实时更新,做多少更多少(五)
  9. 史上最全高级Java教程总结版(强烈建议收藏)
  10. JavaWeb框架三剑客前言
  11. 实验三.局域网的组建
  12. vue+element实现一个excel表格下载的功能
  13. 查看本地windows密码方法
  14. ECMAScript和JavaScript的区别
  15. IDA 逆向代码 --- _stack_chk_guard变量 之后的局部 怎么处理
  16. 知道创宇云安全双十一「3-6折」大促攻略
  17. 咋么用计算机打出,键盘怎么输入符号_怎么用电脑键盘打符号-win7之家
  18. 小米无线路由器服务器用户名和密码忘了,小米路由器无线密码(wifi密码)忘记了怎么办? | 192路由网...
  19. 模拟时钟:时钟根据时间转动
  20. vs2015+qt国际化翻译问题:Linguist中源代码不可见

热门文章

  1. SOUI自定义控件(1)
  2. Java实现十字形开关问题(“飞行员兄弟“)
  3. 安卓开发-Parcel机制
  4. 创业需要宽广的心胸吗--leo看赢在中国第三季(6)
  5. 做个全栈工程师真的好吗?
  6. 全网通工业级3G/4G无线路由器
  7. 按钮默认点击事件(打开页面时按钮默认被点击)
  8. React 热区组件
  9. 编译出现问题:-Dmaven.multiModuleProjectDirectory=$M2_HOME
  10. 探探php模板下载,PHP开发的优客365网址导航商业精华版1.1.6版本源码带WAP手机版附带三款模板和四款插件_随便下源码网...