牛客网华为机试题(JavaScript)

华为机试题

牛客网在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);

你可能感兴趣的:(数据结构与算法,数据结构与算法,js)