问题描述
问题出在:https://www.hackerrank.com/challenges/mini-max-sum/problem
问题描述:给定五个正整数,找到可以通过对五个整数中的四个精确求和而得出的最小值和最大值。然后将各自的最小值和最大值打印为两个空格分隔的长整数的单行。
问题:对于某些测试用例,我得到了-ve的输出,我理解它的输出是因为存储“ int”大小的限制,这就是为什么要获得-ve值的原因。 我不明白我在哪里犯错。
我的解决方案:
static void miniMaxSum(int[] arr) {
int n = arr.length;
long[] ar = new long[n];
ar[0] = arr[1] + arr[2] + arr[3] + arr[4];
ar[1] = arr[0] + arr[2] + arr[3] + arr[4];
ar[2] = arr[0] + arr[1] + arr[3] + arr[4];
ar[3] = arr[0] + arr[1] + arr[2] + arr[4];
ar[4] = arr[0] + arr[1] + arr[2] + arr[3];
long[] a = new long[n];
for(int i=0; i<n; i++){
a[i]=ar[i];
}
Arrays.sort(a);
long max =a[4];
long min =a[0];
System.out.print(min+" "+max);
}
HackerRank提供的预先编写的代码:
import java.io.*;
import java.math.*;
import java.security.*;
import java.text.*;
import java.util.*;
import java.util.concurrent.*;
import java.util.regex.*;
public class Solution {
// Complete the miniMaxSum function below.
static void miniMaxSum(int[] arr) {
}
private static final Scanner scanner = new Scanner(system.in);
public static void main(String[] args) {
int[] arr = new int[5];
String[] arrItems = scanner.nextLine().split(" ");
scanner.skip("(\r\n|[\n\r\u2028\u2029\u0085])?");
for (int i = 0; i < 5; i++) {
int arrItem = Integer.parseInt(arrItems[i]);
arr[i] = arrItem;
}
miniMaxSum(arr);
scanner.close();
}
}
解决方法
首先,您应该在解决问题时编写通用代码,以便它可以针对该问题执行各种测试案例。例如。如果数组大小更大怎么办?
我还看到,在对您的问题的一些答案中,他们首先对数组进行了排序,从而使代码变慢了。在这种情况下,您不需要排序。
这是解决方案,可以解决O(n)中的问题并且速度更快
static void minMaxSum(int[] arr) {
int min = arr[0];
int max = arr[0];
long totalSum = arr[0];
for (int i = 1; i < arr.length; i++) {
if (min > arr[i]) {
min = arr[i];
} else if (max < arr[i]) {
max = arr[i];
}
totalSum += arr[i];
}
long minSum = totalSum - max;
long maxSum = totalSum - min;
System.out.println(minSum + " " + maxSum);
}
现在问您一个原始问题,即为什么int数据没有转换成long。
之所以发生这种情况,是因为当您使用C,C ++,Java或C#等语言添加多个整数时,由于所有操作数都是整数,因此计算的结果将始终是整数。并且由于结果是整数,因此它计算了-ve整数值,然后为其分配了长整数。这么久没收到原始值。
要长时间解释加法,您应该对四个操作数之一执行显式类型转换。 看到,int + int => int 但是,long + int => long
因此,您应该编写(将第一个操作数转换为long型)
ar[0] = (long)arr[1] + arr[2] + arr[3] + arr[4]
这将给出正确的结果。
,始终以通用方式编写代码,您对所有内容都进行了硬编码(固定5个元素)。
使用以下解决方案,它将通过您的所有测试用例:
static void miniMaxSum(int[] arr) {
int n =arr.length;
Arrays.sort(arr);
long min = 0;
long max = 0;
for(int i = 0; i <= n - 2; i++){
min += arr[i];
}
for (int i = 1; i <= n - 1; i++){
max += arr[i];
}
System.out.println(min + " " + max);
}
,
输出没有问题,它已经在long
中。但是,您的逻辑没有道理,您已经创建了5个数组ar
,每个数组的总和不同。
for
循环将ar[4]
存储在a[i]
中。排序是在单个元素上完成的,并且max
和min
被分配了任意值。
您只需要按升序对数组进行排序,找到前4个元素和后4个元素的总和并显示它们即可。
static void miniMaxSum(int[] arr)
{
long sum1 = 0,sum2 = 0;
Arrays.sort(arr); //Ascending Sort
for (int i = 0; i < 4; i++)
sum1 += arr[i]; //First 4 sum
for (int j = arr.length - 1; j > 0; j--)
sum2 += arr[j]; //Last 4 sum
System.out.println(sum1 + " " + sum2);
}