【问题标题】:Javascript Mini-Max Sum HackerRank problem returns wrong sum?Javascript Mini-Max Sum HackerRank 问题返回错误的总和?
【发布时间】:2022-06-19 20:22:57
【问题描述】:

我一直在努力找出自己做错了什么。在 HackerRank 问题中,Mini-Max Sum 的问题是求 5 个数字组成的数组的一部分的总和。在他们给你的例子中,他们告诉你arr = [1,2,3,4,5],最小和是1+2+3+4 = 10,最大和是2+3+4+5 = 14

我还是新手,所以解决问题有时对我来说仍然是一个挑战。我想出了这个作为我的第一个解决方案:

function minMax(arr){

   console.log(arr, 'this is our arr')

   var baseSum = 0
   var minSum = 0
   var maxSum = 0
   var i = null


   for(i=1;i<4;i++){
     baseSum += arr[i]
   }

   console.log(baseSum, 'this is baseSum')
   console.log(minSum = baseSum + arr[0], maxSum = baseSum + arr[4])
}

const numArr = [7, 69, 2, 221, 8974]

minMax(numArr)

我的想法是我可以抓取两个变量之间一致的数字,抓取数组的第一个和最后一个数字并将它们相加得到结果。它通过了一项测试,但在numArr 列出的值处失败,如果我将最后 4 个数字相加,我得到 9266,但预期值为 9271

我花了一些时间想办法重构它,我知道一开始并不好,但我正在努力!

我想出了这个-

function minMax(arr){
  if (arr.length > 5){
    return "Too long"
  }

  var minArr = arr.slice(0,4)
  var maxArr = arr.slice(1,5)

  minSum = 0
  maxSum = 0

  for (i=0; i < minArr.length;i++){
    minSum += minArr[i]
  }

  for (x=0; x < maxArr.length; x++){
    maxSum += maxArr[x]
  }

  console.log(minSum, maxSum)
}

但它返回的内容与以前完全相同。所以我要么不理解这个问题(可能正在发生什么),要么他们的期望值的总和是错误的。我什至只是抓起一个计算器,得到 9266,所以我不明白我做错了什么。

有没有人遇到过这种情况,他们有什么想法吗?

更新

我自己并不感到惊讶,我读错了问题。您应该在得到总和之前对实际数组进行排序。他们并没有在问题中真正说明,所以它的措辞很糟糕 imo 哈哈,但这最终是我所做的一切,以获取正确的值,以防有人想知道。

if (arr.length > 5){
    return "Too long"
  }



  arr.sort(function(a, b) {
  return a - b;
  });

  var minArr = arr.slice(0,4)
  var maxArr = arr.slice(1,5)

  var minSum = 0
  var maxSum = 0
  var i = null
  

  for (i=0;i<minArr.length;i++){
    minSum += minArr[i]
  } 

  for (i=0;i<maxArr.length;i++){
    maxSum += maxArr[i]
  }

  console.log(minSum, maxSum)

}


const numArr = [7, 69, 2, 221, 8974]

minMax(numArr)

这显然总结了不同的值,所以你会得到正确的答案!

【问题讨论】:

  • 我会考虑首先对数组从最高到最低进行排序,反之亦然 - 然后你就可以轻松地抓取(就像你对 slice 所做的那样)只是最高或最低 X 数量值并将它们相加
  • 你试图解决这个问题,就好像输入数组总是排序的,显然情况并非如此。这就是你的困惑的来源。
  • 是的,我的困惑是我认为我不需要以任何方式改变数组,我只取数组中 5 个数字的总和 - 前 4 和最后 4。但是事实并非如此,我阅读了这个问题,但他们并没有很好地解释它,哈哈。我按照@decpk 的建议对数组进行了更改,这给了我正确的值。

标签: javascript arrays


【解决方案1】:

在问题中,没有指定输入数组是否会被排序,所以你唯一缺少的就是对数组进行降序排序。

1)你可以先sort数组中ascending的顺序

const clone = [...arr].sort((a, b) => a - b);

2) 采取first four sum

const minSum = arr.slice(0, 4).reduce(sum, 0);

3) 也采取last four sum

const maxSum = arr.slice(1).reduce(sum, 0);

function minMax(arr) {
  const clone = [...arr].sort((a, b) => a - b);
  const sum = (acc, curr) => acc + curr;
  const minSum = clone.slice(0, 4).reduce(sum, 0);
  const maxSum = clone.slice(1).reduce(sum, 0);
  console.log(minSum, maxSum);
}

const numArr = [7, 69, 2, 221, 8974];

minMax(numArr);

【讨论】:

  • 你不应该使用[...arr].sort(...);,因为[...arr] == arr。取而代之的是,您应该通过执行arr.sort(...); 进行排序。这就是为什么您的最大总和关闭的原因,因为当您使用arr.slice(...) 时,编程正在读取arr 的未更改内存。我建议使用就地排序,因为这是语言的设计(与底层语言 C 相同,它使用指针来传递数组而不是值),或者您只需将 arr.slice(...) 更改为 clone.slice(...)
  • @charlie-map [...arr]arr 在 JS 中不相等。因为[...arr]arr 的克隆。你应该阅读this
  • 你是对的。我的符号在那里肯定是不正确的。我的意思是[...arr][arr]逻辑上 是等效的,并且在排序之前以相同的顺序包含相同的值。我的建议仍然是使用arr.sort(...) 就地排序,因为我们不需要数组的克隆。我同意,如果我们要对数组做一些破坏性的事情,但又想保留原来的,那么克隆可能是有益的。
  • 虽然问题中没有提到排序。我会说 HackerRank 问题具有误导性。如果这意味着应该对数字进行排序,那么它应该这样说,因为这对解决方案至关重要。否则最小值/最大值是错误的。
【解决方案2】:

继续有一些半 MinMax 导向的东西。我建议将排序作为一个单独的步骤。然后你可以在数组中有两个指针同时在数组中移动来计算最小值和最大值:

function rank(arr, low, high) {
  if (arr.length > 5) {
    console.log("Too long");
    return;
  }

  // we reached the fourth value, so we stop
  if (high == 1)
    return [arr[low], arr[high]];

  // continue calculating at further depth
  let minMaxRecur = rank(arr, low + 1, high - 1);
  return [arr[low] + minMaxRecur[0], arr[high] + minMaxRecur[1]];
}

let initialArray = [7, 69, 2, 221, 8974];
initialArray.sort((a, b) => a - b); // sort first

console.log(rank(initialArray, 0, 4));

这使用递归算法对数组进行计数,但是这当然可以通过遍历数组的单个循环来简单得多,例如:

function rankLoop(arr) {

  let min = 0, max = 0;
  for (let i = 0; i < 4; i++) {
      min += arr[i];
      max += arr[4 - i];
  }
  
  return [min, max];
}

console.log(rankLoop([2, 7, 69, 221, 8974], 0, 4));

这再次假设传入的数组已排序,这可以在我的第一个代码 sn-p 中看到。这两种方法都具有相同的时间复杂度。

【讨论】:

  • 如果你排序不改变问题,从而改变解决方案?似乎 HackerRank 需要在问题中更清楚地说明这一点。
【解决方案3】:

在 Python 中:

def miniMaxSum(arr):
    arr.sort()
    hold = [None]*int(len(arr)-3)

    for i in range(0,len(arr)-3):
        temp = 0

        for j in range(i,i+4):
            temp = temp + arr[j]
        hold[i] = temp
    
    print(hold[0],hold[-1])

【讨论】:

    【解决方案4】:

    function miniMaxSum(arr) {
        
    let max = arr[0];
        let min = arr[0];
        let sum = 0;
        for (let i = 0; i < 5; i++) {
            if(max< arr[i]){
                max= arr[i];
            }
            if(min> arr[i]){
                min=arr[i];
            }
    
            sum += arr [i];
            
        }
        let maxSum= sum -min;
        let minSum = sum - max;
        console.log(minSum +" "+ maxSum);}
        
        minMax([your data])

    【讨论】:

      猜你喜欢
      • 2022-06-19
      • 1970-01-01
      • 2022-08-08
      • 1970-01-01
      • 2020-06-07
      • 1970-01-01
      • 2019-11-05
      • 2011-07-03
      • 2011-01-05
      相关资源
      最近更新 更多