记一次华为机试

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

记⼀次华为机试
介绍
华为机试分为 3 题,两题 100 分,⼀题 200 分,压线 150 分算你过,时间150分钟,⽀持多语⾔环境(⽜客⽹),考试时需全程打开摄像头,电脑屏幕分享,⼿机打开某⼩程序(可⽤计算器)不退出,可⽤本地 IDE, 会有⼀些测试题给你熟悉环境预热的。

备注: 由于脑容量有限,题⽬具体的描述笔者已经记不清了,但是⼀些考点还是记忆犹新,遂记录分享下。

做机考这⼏点很重要, 第⼀点是你要看明⽩它的输⼊输出是什么? 第⼆点是要快,⽐如说你明知道有现成的意⼤利炮可以轰它,咱就不要⾃⼰造个⼟炮了,挺浪费时间的,毕竟机考的本质其实是刷⼈, 第三点就是⼼态⼀定要好,你会做的你要尽量 100%把它做出来,遇到不会的智商题,那也就听天由命了。

消消乐(字符串)
描述
给定⼀个只包含⼤⼩写字母的字符串(⼤⼩写敏感),若相邻两个元素相等则消除,直到最后字符串消除不了了,输出消消乐后字符串的长度,若遇到⾮⼤⼩写字母以外的字符,则输出0。

⽰例
输⼊: mMbccbc
输出: 3
解释:cc消掉,然后bb消掉,最后剩余mMc,输出长度3
题解
这⾥我是把⼀些特殊情况单独拎出来处理,然后创建了⼀个字符串res去存最后得到的字符串,然后输出其长度。

const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
rl.on('line', function (line) {
console.log(solution(line.trim()));
});
function solution(str) {
if (/[^a-zA-Z]/.test(str)) {
return 0;
}
if (str.length === 1) {
return 1;
}
if (str.length === 2) {
if (str[0] === str[1]) {
return 0;
} else {
return 2;
}
}
let res = '';
let cur = 0;
for (let i = 0; i < str.length - 1; i++) {
if (str[i] === str[i + 1]) {
i++;
} else {
if (res.length > 0 && res[res.length - 1] === str[i]) {
res = res.slice(0, res.length - 1);
} else {
res += str[i];
}
}
cur = i;
}
cur = cur + 1;
if (str[cur]) {
if (res[res.length - 1] === str[cur]) {
res = res.slice(0, res.length - 1);
} else {
res += str[cur];
}
}
return res.length;
}
矩阵最⼤值(⼆维矩阵)
描述
给定⼀个n*n的只包含0和1的⼆维矩阵,请你计算出该矩阵的最⼤值。

计算⽅式为将每⼀⾏的元素组成⼆进制数的⼗进制数相加,每⼀⾏元
素可以进⾏左移右移(实质就是求出每⾏的最⼤值相加), ⽐如说10001向左移⼀位就是00011。

⽰例
输⼊:
5
1,0,0,0,1
0,0,0,1,1
0,1,0,1,0
1,0,0,1,1
1,0,1,0,1
输出:
122
解释:当n为5时,即5*5的⼆维矩阵时,通过相关左右平移,得到⼆维矩阵的最⼤值是122
题解
灵机⼀动,结合了parseInt(str, radix)可以将⼆进制转成⼗进制数,求其最⼤值,最后相加求得矩阵最⼤值。

const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
let count = 0;
let res = 0;
rl.on('line', function (line) {
if (count === 0) {
count = +line;
res = 0;
} else {
res += solution(line.trim());
if (count === 1) {
console.log(res);
}
count--;
}
});
function solution(str) {
const arr = str.split(',');
let max = parseInt(arr.join(''), 2);
const len = arr.length;
for (let i = 1; i < len; i++) {
const tmp = parseInt(arr.slice(i, len).concat(arr.slice(0, i)).join(''), 2);
max = max > tmp ? max : tmp;
}
return max;
}
树的剪枝(树)
描述
给定⼀棵树,删除某个结点(结点值唯⼀)及其下⾯的⼦结点(额,这题是我⾼度概括的,做的操作就类似于给你⼀棵叉树,你⽤剪⼑把某个枝给剪掉去),并把剩余结点按从⼩到⼤输出。

⽰例
输⼊:
5
2 10
8 10
3 8
4 8
1 4
8
输出:
2 10
解释:表⽰先输⼊5组数据,然后每⾏前⾯的数字是⼦结点,后⾯的数字是⽗结点,最后输⼊要删除的结点8,输出剩余的结点(由⼩到⼤)
题解
时间关系,这题就不⽤树去求解了吧,考虑到我是个jser,所以我先创建了⼀个对象obj, 将⽗结点以字符串key的形式存储,将⼦结点以数
组value的形式存储,最后我只需要递归出要删除的值存⼊removed_arr,然后进⾏过滤排序即可得出答案。

const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
let obj = {};
let count = 0;
const removed_arr = [];
rl.on('line', function (line) {
if (count === 0) {
count = parseInt(line) + 1;
obj = {};
removed_arr.length = 0;
} else {
if (count === 1) {
const arr = [];
func(line, obj);
for (const key in obj) {
if (key !== line && !removed_arr.includes(key)) {
arr.push(key);
}
arr.push(...obj[key].filter((item) => !removed_arr.includes(item)));
}
console.log(arr.sort((a, b) => Number(a) - Number(b)).join(' '));
} else {
const [value, key] = line.split(' ');
if (obj[key]) {
obj[key].push(value);
} else {
obj[key] = [value];
}
}
count--;
}
});
function func(key, obj) {
if (obj[key]) {
for (const val of obj[key]) {
func(val, obj);
}
}
removed_arr.push(key);
}
最后
总的来说,菊⼚出的试卷题⽬考点还是分布⽐较均匀的,数据结构和常规算法⼀定要好好学,嗯,我回去补树去了。

说明。

相关文档
最新文档