You need to enable JavaScript to run this app. JavaScript实现整数串转数组的极值统计函数,for循环计算结果异常
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript实现整数串转数组的极值统计函数,for循环计算结果异常

异常的核心原因

你遇到的输出异常本质是数组元素为字符串类型,比较逻辑走的是字符串字典序规则,而非数值大小规则:

  • string.split(' ')仅会把原字符串按空格切割为子串数组,所有元素的类型都是字符串,不存在你以为的数值类型。
  • JavaScript中用</>运算符做比较时,如果两个操作数是字符串,会逐位对比每个字符的ASCII码值,而非对比数字本身的大小。
错误触发的完整流程

以测试用例"10 20 20 8 25 3 0 30 1"为例,切割后的数组实际为['10','20','20','8','25','3','0','30','1'],初始max存的是字符串'10',逐次比较的实际逻辑:

  1. 对比'20':逐位比第一位,'2'的ASCII码大于'1',判定'10' < '20'成立,max更新为'20',surpasses累加1
  2. 对比第二个'20':字符串完全相等,不触发更新
  3. 对比'8':逐位比第一位,'8'的ASCII码(56)大于'2'的ASCII码(50),判定'20' < '8'成立!max被错误更新为'8',surpasses再累加1
  4. 后续所有元素'25'、'3'、'0'、'30'、'1',和当前的字符串值'8'逐位比较时,第一位的ASCII码都小于'8',因此永远不会触发max的更新,最终max停在'8',surpasses停在2,和你观察到的异常输出完全一致。

为什么reduce搭配Math.max可以得到正确结果?因为Math.max会自动将传入的字符串参数强制转换为数值类型再做大小比较,绕开了字符串字典序比较的逻辑陷阱。

修复方案

只需要在切割字符串后,将所有数组元素转换为数值类型,将原代码中的:
let arrayScore = string.split(' ')
替换为:
let arrayScore = string.split(' ').map(Number)

转换完成后,数组内存储的全部是数值类型,所有比较都会按照正常的数值大小规则运行:

  • 最大值会正确取到30
  • 最大值被超越的次数会正确统计为3次(10→20、20→25、25→30)
  • 最小值为0,所在位置为第7位,完全符合题目要求。
修正后的完整可运行代码
function performance(string) {
    // 切割字符串后直接转换为数值数组
    let arrayScore = string.split(' ').map(Number)

    let max = arrayScore[0]
    let min = arrayScore[0]

    let worstgame = 1
    let surpasses = 0

    for (let i = 0; i < arrayScore.length; i++) {
        if (max < arrayScore[i]) {
            max = arrayScore[i]
            surpasses++
        }

        if (min > arrayScore[i]) {
            min = arrayScore[i]
            worstgame = i + 1
        }
    }

    return [surpasses, worstgame, max, min]
}

let score = "10 20 20 8 25 3 0 30 1"
console.log(performance(score)) // 输出 [3, 7, 30, 0]

内容的提问来源于stack exchange,提问作者Baam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.31 17:54:04