牛客网华为机试考试java_牛客网华为机试题(JavaScript)

本文介绍了牛客网上关于华为机试的若干道JavaScript编程题目,包括字符串处理、字符计数、随机数处理、字符串分隔、质数因子等。每道题目提供了详细的解题思路和代码实现,帮助考生理解和解决华为机试中的实际问题。
摘要由CSDN通过智能技术生成

华为机试题

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

文章目录

华为机试题1. 字符串最后一个单词的长度2. 计算字符个数3. 明明的随机数4. 字符串分隔5. 质数因子题目描述6. 取近似值7. 合并表记录8. 提取不重复的整数9. 字符个数统计10. 数字颠倒知识补充:正则表达式11. 字符串反转12. 句子逆序

13. 字串的连接最长路径查找14. 求int型正整数在内存中存储时1的个数

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

// 数组去重方式二,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]);

}

}

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 是否小于 127

if (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);

108题中有部分题目重合,因此么有收录在压缩文件中。 华为机试 ├─001 字符串最后一个单词长度 │ └─Source ├─002 计算字符个数 │ └─Source ├─003 明明的随数 │ └─Source ├─004 字符串分隔 │ └─Source ├─005 进制转换 │ └─Source ├─006 质数因子 │ └─Source ├─007 取近似值 │ └─Source ├─008 合并表记录 │ └─Source ├─009 提取不重复的整数 │ └─Source ├─010 字符个数统计 │ └─Source ├─011 数字颠倒 │ └─Source ├─012 字符串反转 │ └─Source ├─013 句子逆序 │ └─Source ├─014 字典序排序 │ └─Source ├─015 求int型正整数在内存中存储是1的个数 │ └─Source ├─016 购物单 │ ├─Debug │ ├─Source │ │ └─Debug │ ├─Source - 时间优先 │ │ └─Debug │ └─Source - 空间优先 │ ├─Debug │ └─Release ├─017 坐标移动 ├─018 识别IP地址分类统计 │ └─Source │ └─Debug ├─019 错误记录 ├─020 密码验证合格程序 ├─021 密码破解 ├─023 删除字符串中出现次数最少字符 │ └─Source │ └─Debug ├─024 合唱队 │ └─Source │ ├─Debug │ └─Release ├─025 数据分类处理 │ └─Source │ └─Debug ├─026 查找兄弟单词 │ └─Source │ └─Debug ├─027 素数伴侣 │ └─Source │ └─Debug ├─028 字符串合并处理 │ └─Source │ └─Debug ├─030 密码截取(查找最长回文字符串) ├─031 蛇形矩阵 │ └─Source │ └─Debug ├─033 判断IP是否属于同一子网 │ └─Source │ └─Debug ├─034 称砝码 │ └─Source │ └─Debug ├─035 学英语 │ └─Source │ └─Debug ├─036 迷宫问题 │ └─Source │ └─Debug ├─037 数独问题 │ └─Debug ├─038 名字漂亮度 │ └─Source │ └─Debug ├─039 字符串截取 │ └─Source │ └─Debug ├─040 单链表删除数据 │ └─Source │ └─Debug ├─041 多线程 │ └─Source │ ├─Backup │ ├─Debug │ │ └─041.tlog │ └─Release │ └─041.tlog ├─042 表达式计算 │ └─Source │ └─Debug ├─043 计算字符串距离 │ └─Source │ └─Debug ├─044 杨辉三角形变形 ├─046 挑7 ├─047 完全数 │ └─Debug ├─048 高精度加法 ├─049 输出n个数中最小的k个 │ └─Debug ├─050 找出字符串只出现一次的字符 │ └─Debug ├─051 组成一个偶数最接近的2个质数 │ └─Debug ├─052 M个苹果放入N个盘子 ├─053 查找整数二进制中1的个数 ├─054 DNA子串 ├─055 MP3光标位置 │ └─Source │ └─Debug ├─056 查找2个字符串最大相同子串 │ └─Debug ├─057 配置文件恢复 │ └─Source │ └─Debug ├─058 24点计算 │ └─Debug ├─059 成绩排序 ├─060 矩阵相乘 ├─061 矩阵乘法次数计算 ├─062 字符串通配符 │ └─Debug ├─066 命令行解析 │ └─Source │ └─Debug ├─067 最大相同子串长度 │ └─Debug ├─068 火车编号进站 │ └─Debug ├─072 数组合并 ├─074 埃及分数 │ └─Source │ └─Debug ├─076 密码截取 │ └─Source ├─077 求最大连续bit数 ├─078 密码强度 ├─079 扑克牌大小 │ └─Source │ └─Debug ├─081 合法IP ├─082 棋盘格子走法 ├─083 在字符串中找出连续最长数字串 ├─084 int数组分组,两组和相等 │ └─Source │ └─Debug ├─086 人民币转换 │ └─Source │ └─Debug ├─087 表示数字 ├─090 自动售货系统 │ └─Source │ └─Debug └─091 24点输出 └─Debug
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值