-2

嗨,我在 Hackerrank 上解决了一个非常基本的问题,即确定整数数组中所有值的 Mini-Max Sum。基本上给定一个包含 5 个值的数组,例如 [1, 2, 3, 4, 5],最小和将为 1+2+3+4 = 10,最大和为 2+3+4+5 = 14。非常一个简单的问题,但我遇到了某个大输入值的问题。以下是我的解决方案及其结果。

//Input: 256741038 623958417 467905213 714532089 938071625
//Output: 2063136757 2744467344

下面是使用内置的Sum()方法。

static void Main(string[] args)
{
    int[] arr = new int[5] {256741038,623958417,467905213,714532089,938071625};
    Array.Sort(arr);
    long arrSum = arr.Sum();  //System.OverflowException: 'Arithmetic operation resulted in an overflow.'
    long minSum = arrSum - arr[arr.Length - 1];
    long maxSum = arrSum - arr[0];
    Console.WriteLine(minSum + " " + maxSum);
}

下面是使用聚合扩展方法。

static void Main(string[] args)

{
    int[] arr = new int[5] {256741038,623958417,467905213,714532089,938071625};
    Array.Sort(arr);
    long arrSum = arr.Aggregate((total, next) => total + next); // arrSum = -1293758914
    long minSum = arrSum - arr[arr.Length - 1];
    long maxSum = arrSum - arr[0];
    Console.WriteLine(minSum + " " + maxSum);
}

Output: -2231830539 -1550499952

如果我使用如下的常规 foreach 循环:

static void miniMaxSum(int[] arr)
{
    Array.Sort(arr);
    long arrSum = 0;
    foreach (var value in arr)
    {
        arrSum += value;
    }
    long minSum = arrSum - arr[arr.Length - 1];
    long maxSum = arrSum - arr[0];
    Console.WriteLine(minSum + " " + maxSum);
}

The output is correct as expected i.e. 2063136757 2744467344

此处的 OverflowException 类描述说“算术运算产生的结果超出了操作返回的数据类型的范围”。但该arrSum值在long范围内,所以我无法找出问题所在。所以不确定我是否遗漏了任何东西或错误地使用了这些功能,但无法理解这种行为。

任何细节表示赞赏。

4

1 回答 1

2

它失败的原因是因为 Sum() 方法正在int数组上执行。如果您将 int 数组的数字转换为 long,然后对它们运行 Sum 操作,那么您将得到结果。

long arrSum = nums.Sum(x => (long)x);

// or, for readability
long arrSum = nums.Select(x => (long)x).Sum();

long这将仅在s上运行 Sum 操作。你这样做的方式,它总结了整数,直到完成所有整数,然后“然后”将它保存到你的 long 中。在进行加法时,它失败了,因为 Int32 不能太大。

于 2020-07-22T02:50:50.547 回答