华为机试JS避坑速记清单
核心用途:考前10分钟快速翻看,规避90%高频丢分点,直接对标机试场景
一、 输入输出必避坑(占丢分50%)
| 坑点类型 | 错误写法 | 正确写法 | 避坑口诀 |
|---|---|---|---|
| 多组输入未写终止条件 | rl.on('line', line => {console.log(+a+ +b)}) | rl.on('line', line => {<br> let [a,b] = line.split(' ').map(Number)<br> if(a===0&&b===0) {rl.close();return}<br> console.log(a+b)<br>}) | 多组输入先判停,停了立刻关接口 |
不定长输入用split(' ') | line.split(' ').map(Number) | line.trim().split(/\s+/).filter(Boolean).map(Number) | 任意空格用\s+,过滤空串防干扰 |
| 字符串转数字隐式转换 | const a = +line | const a = parseInt(line) / Number(line) | 显式转换不偷懒,避免''转0坑 |
单行输入用on('line') | rl.on('line', line => {处理逻辑}) | rl.question('', line => {处理逻辑;rl.close()}) | 单行用question,多行用line |
二、 算法逻辑必避坑(占丢分30%)
| 坑点类型 | 错误原因 | 解决方案 | 适用场景 |
|---|---|---|---|
| 二分查找死循环 | 循环条件left < right、更新right=mid | 循环条件left <= right更新 left=mid+1/right=mid-1 | 有序数组查找目标 |
| 两数之和超时 | 双重循环O(n²) | 用Map存已遍历值和索引,O(n)复杂度 | 找两数索引和为目标 |
| 反转整数溢出 | 未判断32位范围 | 循环中提前判断:res > Math.floor(max/10) → 直接返回0 | 整数反转、字符串转整数 |
| DFS重复访问 | 未标记已访问节点 | 网格问题:访问后设为'0';树问题:传参避免全局变量 | 岛屿数量、迷宫问题 |
| 动态规划空间浪费 | 用数组存全部状态 | 滚动变量优化(如爬楼梯用两个变量代替数组) | 线性DP(爬楼梯、最大子数组和) |
三、 字符串/数组必避坑(占丢分20%)
| 坑点类型 | 错误操作 | 正确操作 | 避坑提醒 |
|---|---|---|---|
| 数组去重效率低 | arr.filter((v,i)=>arr.indexOf(v)===i) | [...new Set(arr)] | 大数据量优先用Set |
| 字符串截取越界 | str.substr(start, len)(参数易混) | str.slice(start, end) | slice参数是起止索引,更直观 |
| 数组排序失效 | arr.sort()(字典序排序) | arr.sort((a,b)=>a-b)(数字升序) | 数字排序必须传比较函数 |
空数组Math.max报错 | Math.max(arr) | arr.length ? Math.max(...arr) : 0 | 先判断数组是否为空 |
四、 考场应急避坑指南
代码提交前必查3点
输入是否
trim()?是否处理了空输入?数字是否显式转换?是否有溢出判断?
多组输入是否有终止条件?是否调用
rl.close()?
超时急救方案
把
Array.indexOf()换成Map.has()把嵌套循环拆成单循环+哈希表
递归改迭代(避免栈溢出)
格式错误急救方案
输出是否严格匹配(空格/换行)?
数组输出是否用
join(','),而非直接打印数组?布尔值输出是否是
true/false,而非1/0?
需要我帮你把这份清单整理成可打印的PDF版,方便你考前随身携带吗?
(注:文档部分内容可能由 AI 生成)