华为机试

1,064 阅读6分钟

华为机试题库: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,说明用计算机生成了31500之间的随机整数,接下来每行一个随机数字,共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.52.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()
}