// 假设本地机器无法做加减乘除法,需要通过远程请求让服务端来实现。
// 以加法为例,现有远程API的模拟实现
const addRemote = async (a, b) => new Promise(resolve => {
setTimeout(() => resolve(a + b), 1000)
})
let starttime = new Date().getTime()
// 请实现本地的add方法,调用addRemote,能最优的实现输入数字的加法。
const map = new Map()
const getMapKeys = (inputs) => {
let mapKeys = []
inputs = inputs.sort((a, b) => a - b)
for (let i = 0;i<inputs.length; i++) {
if (inputs.length - i <= inputs.length/2) {
mapKeys.push([`${inputs[i]}+${inputs[inputs.length -i]}`, `${inputs[inputs.length -i]}+${inputs[i]}`])
}
}
return mapKeys
}
const caculate = async (key) => {
let agrs = key.split('+')
agrs = agrs.map(e=> +e)
return await addRemote(...agrs)
}
async function add(...inputs) {
// 你的实现
if (inputs.length <2) return inputs
let mapKeys = getMapKeys(inputs)
let res = 0;
for (let i = 0; i<mapKeys.length; i++) {
// console.log('map', map)
if (map.has(mapKeys[i][0])) {
res += map.get(mapKeys[i][0])
} else if(map.has(mapKeys[i][1])) {
res += map.get(mapKeys[i][1])
} else {
let result = await caculate(mapKeys[i][0])
map.set(mapKeys[i][0], result)
map.set(mapKeys[i][1], result)
res += result
}
}
return res
}
// // 请用示例验证运行结果:
let arr = Array(20).fill(20).map(() => Math.ceil(Math.random() * 10))
add(arr).then(result => {
console.log(result) // 3
endTime = new Date().getTime()
console.log(endTime - starttime)
})