求实现getLastNumbers函数:提取数组最后一个运算符后的数字序列
实现
getLastNumbers函数:提取最后一个运算符后的数字组 首先明确需求:
实现一个名为
getLastNumbers的函数,该函数遍历数组,返回最后一个运算符(+、-、*、/)之后的最后一组数字(将数字拼接为整数)。
现有代码的问题
你的思路方向没问题,但在定位最后一个运算符时存在逻辑漏洞:
- 使用
arr.indexOf(arr[i])会返回第一个匹配运算符的索引,而非当前遍历到的运算符位置——如果数组中有多个相同运算符,这会直接导致你拿到错误的索引值。 - 整个找最后运算符的流程过于繁琐,不需要先统计运算符数量再循环计数,反向遍历找第一个运算符的方式会更高效简洁。
优化后的实现代码
这里给出更可靠且简洁的实现:
function getLastNumbers(arr) { // 用集合存储运算符,方便快速判断 const operators = new Set(['+', '-', '*', '/']); let lastOpIndex = -1; // 从数组末尾往前遍历,找到第一个运算符就停止 for (let i = arr.length - 1; i >= 0; i--) { if (operators.has(arr[i])) { lastOpIndex = i; break; } } // 处理数组中没有运算符的特殊情况 if (lastOpIndex === -1) { return parseInt(arr.join('')); } // 提取运算符后的所有数字,拼接成整数返回 const numberStr = arr.slice(lastOpIndex + 1).join(''); return parseInt(numberStr); }
思路解释
- 运算符集合:用
Set存储运算符,判断元素是否为运算符的操作更高效,代码也更简洁。 - 反向遍历定位运算符:从数组末尾开始往前找,找到第一个运算符就记录位置并跳出循环,这是最直接高效的方式,实际遍历次数通常远小于数组长度。
- 无运算符场景处理:如果数组里没有运算符,直接把所有数字拼接成整数返回。
- 数字拼接:用
slice提取运算符之后的所有元素,直接join('')拼接成字符串,再转为整数。
测试示例验证
用你给出的示例测试,结果均符合预期:
- 输入
[1, 1, 1, 1, 1, 1, "+", 2, 2, 2, 2, 2, 2, "*", 3, 3, 3, 3, 3, "-", 6, 6, 6, 6]→ 返回6666 - 输入
[1, 1, 1, 1, "+", 6, 6, 6, 6, 6, 6, "*", 9, 9, 9, 9, 9, "-", 6, 6, 6, 6, "+", 3, 3, 3]→ 返回333 - 输入
[7, "*", 7, "-", 6, "+", 3, "+", 6, "+", 3, 3, 3, 3, 3, "+", 6, "-", 5, 5, 5, 5, 5, 5, "*", 9, 9]→ 返回99 - 输入
[5, "*", 5]→ 返回5 - 你提供的测试用例
[1, "+", 3, 3, 3, 3, 3, "+", 6, "+", 9, "*", 6, 6, 6, 3, 6, 6, 6, "-", 5, "*", 9, 9, 9, 9, 9, 9, 9, '/', 6, 8, 9, 9, '*', 8, 8, 8, 7]→ 返回8887
内容的提问来源于stack exchange,提问作者NewTech
相关产品推荐
相关产品推荐

