华为机试题库:www.nowcoder.com/ta/huawei/
HJ1 字符串最后一个单词的长度
题目描述:计算字符串最后一个单词的长度,单词以空格隔开,字符串长度小于5000。(注:字符串末尾不以空格为结尾)
输入:
hello nowcoder
输出:
8
题解
const strArr = readline().split(' ')
function endLength(){
return strArr.pop().length
}
console.log(endLength())
拓展:
- split()用于把一个字符串分割成字符串数组,不改变原始字符串,join()可以将数组中的所有元素放入一个字符串,并且不改变原数组
- pop() 删除数组中最后一个元素,并返回该元素,改变原数组,shift() 删除数组中第一个元素,并返回该元素,改变原数组
HJ2 计算某字符出现次数
题目描述:写出一个程序,接受一个由字母、数字和空格组成的字符串,和一个字符,然后输出输入字符串中该字符的出现次数。
计算字符串最后一个单词的长度,单词以空格隔开,字符串长度小于5000。(注:字符串末尾不以空格为结尾)不区分大小写字母)
输入
ABCabc
A
输出
2
题解
const line = readline().toUpperCase()
const code = readline().toUpperCase()
function findNum() {
let count = 0
for(let i=0;i<line.length;i++) {
if(line[i]===code) {
count++
}
}
return count
}
console.log(findNum())
拓展:
- readline() 是 Node.js 里实现标准输入输出的封装好的模块,通过这个模块可以以逐行的方式读取数据流
- toUpperCase() 将字符串转换为大写,toLowerCase() 将字符串转换为小写一样,对非字母字符不会产生影响,同时也不会改变原字符串
HJ3 明明的随机数
题目描述:第一行先输入随机整数的个数 N 。 接下来的 N 行每行输入一个整数,代表明明生成的随机数。 具体格式可以参考下面的"示例"。
输入:
3
2
2
1
输出:
1
2
说明:
输入解释:
第一个数字是3,也即这个小样例的N=3,说明用计算机生成了3个1到500之间的随机整数,接下来每行一个随机数字,共3行,也即这3个随机数字为:
2
2
1
所以样例的输出为:
1
2
题解
const n = readline()
function randomNum() {
const arr = []
for (var i = 0; i < n; i++) {
const item = readline()
!arr.includes(item) && arr.push(item)
}
arr.sort((a, b) => a - b).forEach(item => { console.log(item) });
}
randomNum()
拓展:
- sort((a, b) => a - b)表示生序排法,sort((a, b) => b - a)表示降序排法
HJ4 字符串分隔
题目描述:连续输入字符串,请按长度为8拆分每个输入字符串并进行输出;长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。
输入:
abc
输出:
abc00000
题解
const str = readline()
function splitStr() {
let arr = []
let s = ''
for (var i = 0; i < str.length; i++) {
s = s + str[i]
if ((i + 1) % 8 === 0) {
arr.push(s)
s = ''
}
}
if (s) {
let l = s.length
for (var i = 0; i < 8 - l; i++) {
s = s + '0'
}
arr.push(s)
}
arr.forEach(item => { console.log(item) })
}
splitStr()
HJ5 进制转换
题目描述:写出一个程序,接受一个十六进制的数,输出该数值的十进制表示。
输入:
0xAA
输出:
170
题解
const sixteen = readline()
function turnScale() {
let result = 0
const map = {
'A': 10,
'B': 11,
'C': 12,
'D': 13,
'E': 14,
'F': 15
}
let index = 0
for (let item of sixteen.slice(2).split('').reverse().join('')) {
if (map.hasOwnProperty(item)) {
result = result + map[item] * Math.pow(16, index)
}
else {
result = result + parseInt(item) * Math.pow(16, index)
}
index++
}
console.log(result)
}
turnScale()
拓展:
- 16进制转10进制方法,用个位数乘16的0次方+十位数乘16的1次方+百位数乘16的2次方+千位数乘16的3次方+...相乘的时候,前面的一位数乘以的数是十后面一,
例如0xff转换成十进制15*16^0+15*16^1=255 - Math.pow(底数,几次方),计算次方
split('').reverse().join('')一起用就是翻转字符串
HJ7 取近似值
题目描述:写出一个程序,接受一个正浮点数值,输出该数值的近似整数值。如果小数点后数值大于等于 0.5 ,向上取整;小于 0.5 ,则向下取整。
输入:
5.5
输出
6
0.5>=0.5,所以5.5需要向上取整为6
## 示例2
输入:
2.499
输出:
2
0.499<0.5,2.499向下取整为2
题解
//readline()方法读取的是string类型,需要用parseFloat()等方法转换为浮点型
const num = parseFloat(readline());
//接下来用parseInt()方法舍弃小数的特性,在数字上加上0.5再舍弃小数就可以实现四舍五入了
console.log(parseInt(num + 0.5))
HJ8 合并表记录
题目描述:数据表记录包含表索引index和数值value(int范围的正整数),请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照index值升序进行输出。
输入:
4
0 1
0 2
1 2
3 4
输出:
0 3
1 2
3 4
## 示例2
输入:
3
0 1
0 2
8 9
输出:
0 3
8 9
题解
let n = parseInt(readline())
function merge() {
const map = new Map()
while (n--) {
// 1、把每一行输入转成数组 0 1 转成 [0,1]
const item = readline().split(' ')
// 2、判断字典是否存在该 key ,存在就合并,不存在就添加
if (map.has(item[0])) {
map.set(item[0], map.get(item[0]) + parseInt(item[1]))
} else {
map.set(item[0], parseInt(item[1]))
}
}
for (const key of [...map.keys()].sort((a, b) => (a - b))) {
console.log(key + ' ' + map.get(key))
}
}
merge()
扩展:
- Map 类型的数据使用keys()获取出来的不是一个数组,而是一个类数组,需要用 Array.from 或者扩展运算符转为数组
HJ9 提取不重复的整数
题目描述:输入一个 int 型整数,按照从右向左的阅读顺序,返回一个不含重复数字的新的整数。保证输入的整数最后一位不是 0
输入:
9876673
输出:
37689
题解
const str = readline()
function getOne() {
const arr = []
for (const item of str.split('').reverse()) {
!arr.includes(item) && arr.push(item)
}
console.log(parseInt(arr.join('')))
}
getOne()
HJ10 字符个数统计
## 示例1
输入:
abc
输出:
3
## 示例2
输入:
aaa
输出:
1
题解
const str = readline()
function statistics() {
let arr = []
for (const item of str) {
!arr.includes(item) && arr.push(item)
}
console.log(arr.length)
}
statistics()
HJ11 数字颠倒
输入:
1516000
输出:
0006151
题解
const str = readline()
console.log(str.split('').reverse().join(''))
HJ14 字符串排序
题目描述:给定 n 个字符串,请对 n 个字符串按照字典序排列。
输入
9
cap
to
cat
card
two
too
up
boat
boot
输出
boat
boot
cap
card
cat
to
too
two
up
题解
let n = parseInt(readline())
function strSort() {
let arr = []
while (n--) {
arr.push(readline())
}
arr.sort().forEach(item => { console.log(item) })
}
strSort()
HJ15 求int型正整数在内存中存储时1的个数
题目描述:输入一个 int 型的正整数,计算出该 int 型数据在内存中存储时 1 的个数,也就是将这个10进制的数转成2进制,再计算里面1的个数
输入
5
输出
2
题解
var num = readline();
let str = parseInt(num,10).toString(2) + '';
str = [...str]
let count = 0
str.forEach(e=> e == '1' ? count++ : '')
console.log(count)
扩展
- js可以很简单的做任意进制的转化,核心函数是全局函数parseInt(str,radix)与Number.toString(radix)
- parseInt(str,radix); 将字符串str按照radix进制编码方式转换为10进制返回,没有radix,默认为10; 此方法把任意进制字符串转为10进展返回。
- parseInt(num,8); //八进制转十进制
- parseInt(num,16); //十六进制转十进制
- parseInt(num).toString(8) //十进制转八进制
- parseInt(num).toString(16) //十进制转十六进制
- parseInt(num,2).toString(8) //二进制转八进制
- parseInt(num,2).toString(16) //二进制转十六进制
- parseInt(num,8).toString(2) //八进制转二
HJ17 坐标移动
题目描述:开发一个坐标计算工具, A表示向左移动,D表示向右移动,W表示向上移动,S表示向下移动。从(0,0)点开始移动,从输入字符串里面读取一些坐标,并将最终输入结果输出到输出文件里
输入
A10;S20;W10;D30;X;A1A;B10A11;;A10;
输出
10,-10
题解
const arr = readline().split(';')
// test 方法判断是不是非法坐标
function test(str) {
let result = true
if (!['A', 'S', 'W', 'D'].includes(str[0])) {
result = false
}
if (isNaN(Number(str.slice(1)))) {
result = false
}
return result
}
function move() {
const result = [0, 0]
arr.forEach(item => {
if (test(item)) {
let num = parseInt(item.slice(1))
if (item[0] === 'A') {
result[0] = result[0] - num
}
else if (item[0] === 'S') {
result[1] = result[1] - num
}
else if (item[0] === 'W') {
result[1] = result[1] + num
}
else if (item[0] === 'D') {
result[0] = result[0] + num
}
}
})
console.log(result)
}
move()
HJ20 密码验证合格程序
题目描述:密码要求
1.长度超过8位
2.包括大小写字母.数字.其它符号,以上四种至少三种
3.不能有长度大于2的不含公共元素的子串重复 (注:其他符号不含空格或换行)
输入:
021Abc9000
021Abc9Abc1
021ABC9000
021$bc9000
输出:
OK
NG
NG
OK
题解
function test(str) {
let result = true
let count = 0
if (str.length < 9) {
result = false
}
// 判断是否包含大写字母
if (str.match(/^.*[A-Z]+.*$/)) {
count++
}
// 判断是否包含小写字母
if (str.match(/^.*[a-z]+.*$/)) {
count++
}
// 判断是否含有数字
if (str.match(/^.*[0-9]+.*$/)) {
count++
}
// 判断是否含有其他字符
if (str.match(/^.*[^0-9A-Za-z]+.*$/)) {
count++
}
if (count < 3) {
result = false
}
// 判断第三个条件
for (var i = 0; i < str.length; i++) {
let s = str.slice(i, i + 3)
for (var j = i + 3; j < str.length; j++) {
if (s === str.slice(j, j + 3)) {
result = false
}
}
}
return result ? 'OK' : 'NG'
}
let str = readline()
while (str) {
console.log(test(str))
str = readline()
}