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
相关产品推荐
相关产品推荐

