1. // 假设本地机器无法做加减乘除法,需要通过远程请求让服务端来实现。
    2. // 以加法为例,现有远程API的模拟实现
    3. const addRemote = async (a, b) => new Promise(resolve => {
    4. setTimeout(() => resolve(a + b), 1000)
    5. })
    6. let starttime = new Date().getTime()
    7. // 请实现本地的add方法,调用addRemote,能最优的实现输入数字的加法。
    8. const map = new Map()
    9. const getMapKeys = (inputs) => {
    10. let mapKeys = []
    11. inputs = inputs.sort((a, b) => a - b)
    12. for (let i = 0;i<inputs.length; i++) {
    13. if (inputs.length - i <= inputs.length/2) {
    14. mapKeys.push([`${inputs[i]}+${inputs[inputs.length -i]}`, `${inputs[inputs.length -i]}+${inputs[i]}`])
    15. }
    16. }
    17. return mapKeys
    18. }
    19. const caculate = async (key) => {
    20. let agrs = key.split('+')
    21. agrs = agrs.map(e=> +e)
    22. return await addRemote(...agrs)
    23. }
    24. async function add(...inputs) {
    25. // 你的实现
    26. if (inputs.length <2) return inputs
    27. let mapKeys = getMapKeys(inputs)
    28. let res = 0;
    29. for (let i = 0; i<mapKeys.length; i++) {
    30. // console.log('map', map)
    31. if (map.has(mapKeys[i][0])) {
    32. res += map.get(mapKeys[i][0])
    33. } else if(map.has(mapKeys[i][1])) {
    34. res += map.get(mapKeys[i][1])
    35. } else {
    36. let result = await caculate(mapKeys[i][0])
    37. map.set(mapKeys[i][0], result)
    38. map.set(mapKeys[i][1], result)
    39. res += result
    40. }
    41. }
    42. return res
    43. }
    44. // // 请用示例验证运行结果:
    45. let arr = Array(20).fill(20).map(() => Math.ceil(Math.random() * 10))
    46. add(arr).then(result => {
    47. console.log(result) // 3
    48. endTime = new Date().getTime()
    49. console.log(endTime - starttime)
    50. })