You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript查找随机打乱数组中混入的原数组总和元素

问题场景

需要处理一类特殊构造的数组:构造规则是先算出原数组所有元素的和,把这个和插入原数组,再把整个数组随机打乱。对应的构造逻辑可以参考如下伪代码:

实现逻辑参考:currentArray=[n1, n2, n3, n4, sum(currentArray), n5, n6](仅为伪代码示意)
等价构造伪代码:currentArray.push(sum(oldArray)).shuffle(random)(仅为伪代码示意)

最开始想当然以为直接调用Math.max(...array)取数组最大值,就能定位到插入的那个求和值,比如下面这个打乱后的数组:
shuffled=[1, 12, 3, 6, 2]
这个数组里插入的目标值就是12,删掉12之后剩下元素的和刚好是12,这时候取最大值的方法确实能用。
但只要数组里同时有正数和负数,这个方法就彻底没用了,举个例子:
shuffled=[1, -3, -5, 7, 2]
这个数组里真正的插入值是1,删掉1之后剩下元素的和刚好等于1,根本没法通过取最大值找到它。

可行实现方案

更新
这个问题有个逻辑非常简单、但第一眼很难想到的解法,下面是可以正常跑通的实现代码:

Array.prototype.polysplice = function (criteria)  {
    this.splice(this.indexOf(criteria),1)
    return this 
}
    
Array.prototype.polysort = function () {
    return this.sort((a, b) => a - b)  
}
    
Array.prototype.polysum = function (subject) {
    return this.reduce((a,b) => a + b, 0) 
}

const solution = shuffled => shuffled.polysplice(shuffled.polysum()/2).polysort()
最初错误实现

原始错误代码
下面是最开始写的、无法正常处理负数场景的错误代码:

Array.prototype.sliceAll = function (criteria) {
    return this.filter(e=>e !== criteria) 
}
    
Array.prototype.polysort = function () {
    return this.sort((a, b) => a - b)  
}
    
const solution = shuffled => shuffled.sliceAll(Math.max(...shuffled)).polysort()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 11:27:22