我不明白这段代码发生了什么

时间:2021-05-03 18:49:53

标签: javascript

给定一个正整数数组。当数组有多个元素时,您可以选择两个元素并用它们的总和或乘积替换它们。

你的任务是找到在多次这样的操作后可以保留在数组中的最大可能数量。

示例 对于 arr = [1, 3, 2],结果应该是 9。

为了使答案最大化,第一个操作将是 1 + 2(数组变为 [3, 3])和接下来的 3 * 3(数组变为 [9]),因此最终结果为 9 .

function sumOrProduct(arr) {
  if(arr.length == 1) return arr[0];
     arr = arr.sort();
  if(arr[0] == 1){
    if(arr.indexOf(2) == -1) arr.push(arr.shift() + arr.shift())
  else arr.push(arr.shift() + arr.splice(arr.indexOf(2),1)[0])
 }else arr.push(arr.shift() * arr.shift())
  return sumOrProduct(arr)
}

我不明白这部分,为什么他在那里使用 shift 方法。

if(arr[0] == 1){
if(arr.indexOf(2) == -1) arr.push(arr.shift() + arr.shift())
else arr.push(arr.shift() + arr.splice(arr.indexOf(2),1)[0])
}else arr.push(arr.shift() * arr.shift())

1 个答案:

答案 0 :(得分:1)

这是一个有趣的问题,但似乎解决方案是if there's 1, add it to the next lowest number, then multiply all the others

function sumOrProduct(arr){
  arr.sort((a,b)=>a-b)
  var num=arr[0]
  for(let i=1;i<arr.length;i++){
    if(num==1){num+=arr[i]}
    else{num*=arr[i]}
  }
  return num||0
}

console.log( sumOrProduct([1,2,3]) )
console.log( sumOrProduct([1,3,2]) )
console.log( sumOrProduct([1,5,3,2,4]) )

移位的作用是,它使用自定义起始点(如 for loop)循环遍历数组,除了它不使用 for loop 并使用递归和移位从数组中取出值,因此没有处理相同的数字。至于为什么要完成这种复杂化而不是使用 for 循环?我认为这个人讨厌循环 ;-;