【问题标题】:Find the longest even sum in array [closed]查找数组中最长的偶数和[关闭]
【发布时间】:2021-01-12 15:45:01
【问题描述】:

我正在尝试解决一个问题,该问题需要一个大小为 n 的数组,并在数组中找到具有偶数和的最长数字范围。

例如,对于数组:[2,3,1,8,4,7,2],将返回值 5,因为前五个数字的范围是求偶数的最长范围。

我得到了一个有效的算法,但这是我正在寻找的奖励。 请求是仅从数组的值中读取一次且仅一次。

我的解决方案包括对整个数组求和,然后从头到尾找到最大长度,然后从头到尾。 但这是读取数组 3 次。

你能指导我正确的方向吗?谢谢!

【问题讨论】:

  • 你要我写给你还是解释一下怎么做?
  • 我想要一个解释,一种伪代码。我一直在考虑找到数组中的第一个奇数,保存它的索引并计算其余的奇数。我的方向正确吗?
  • @EatayMizrachi 这就是我要做的。要么总和是偶数,要么你需要去掉一个奇数。所以确实在数组上循环一次,并保留第一个奇数的索引。还要保留最后一个奇数的索引。如果最后一个奇数更接近结尾,则删除该数字以及之后的所有偶数。
  • @MrSmith42 我只是想让你知道,当我说奖金时,很容易误解我在做什么。这个作业没有评分,这是一个奖励,因为找到答案是一个更大的挑战。如果你注意到的话,我还添加了一条评论,询问我的方向是否正确。
  • @iota 非常感谢您的详尽解释。 :)

标签: java algorithm loops


【解决方案1】:

两个奇数之和为偶数,两个偶数之和为偶数,所以当且仅当奇数个数为偶数时,子数组的和为偶数。因此,我们可以通过跟踪第一个奇数的索引、最后一个奇数的索引和奇数的个数来找到答案。如果有偶数个奇数,则整个数组的和为偶数。否则,我们可以得到从第一个奇数的索引加一到数组末尾的子数组的最大长度,以及从数组的前面到奇数的最后一个索引的子数组的最大长度。这些子数组都是具有偶数个奇数的最大可能子数组,因为每个子数组都排除了一个奇数。

function longestEven(arr) {
  let firstOdd = -1,
    lastOdd = -1,
    oddCount = 0;
  for (let i = 0; i < arr.length; i++) {
    if (arr[i] % 2 === 1) {
      if (firstOdd === -1) firstOdd = i;
      lastOdd = i;
      ++oddCount;
    }
  }
  return oddCount % 2 === 0 ? arr.length : 
    Math.max(arr.length - (firstOdd + 1), lastOdd);
}
console.log(longestEven([2, 3, 1, 8, 4, 7, 2]));

【讨论】:

    猜你喜欢
    • 2020-05-13
    • 1970-01-01
    • 2016-04-04
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-27
    • 1970-01-01
    相关资源
    最近更新 更多