嗨,我在 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
范围内,所以我无法找出问题所在。所以不确定我是否遗漏了任何东西或错误地使用了这些功能,但无法理解这种行为。
任何细节表示赞赏。