在Java中打印最大值和最小值
我刚刚开始在HackerRank上练习,以提高我的编码技能。我主要使用Java作为我的首选语言。我遇到了这个问题,我已经尽了最大努力给出了解决方案,但没有清除所有的测试用例我已经清除了15个测试用例中的5个,但仍有10个需要完成。hackerrank上的用户可以通过以下链接查看问题: 无论如何,我只是简单地描述一下这个问题: 问题陈述 给定五个正整数,找出可以通过将五个整数中的四个整数求和来计算的最小值和最大值。然后将各自的最小值和最大值打印为一行两个空格分隔的长整数 例如,在Java中打印最大值和最小值,java,arrays,Java,Arrays,我刚刚开始在HackerRank上练习,以提高我的编码技能。我主要使用Java作为我的首选语言。我遇到了这个问题,我已经尽了最大努力给出了解决方案,但没有清除所有的测试用例我已经清除了15个测试用例中的5个,但仍有10个需要完成。hackerrank上的用户可以通过以下链接查看问题: 无论如何,我只是简单地描述一下这个问题: 问题陈述 给定五个正整数,找出可以通过将五个整数中的四个整数求和来计算的最小值和最大值。然后将各自的最小值和最大值打印为一行两个空格分隔的长整数 例如,arr=[1,3,5
arr=[1,3,5,7,9]
。我们的最小和是1+3+5+7=16
,最大和是3+5+7+9=24
。我们将打印16 24
输出格式
打印两个空格分隔的长整数,表示可以通过将五个整数中的四个整数相加来计算的相应最小值和最大值。(输出可以大于32位整数。)
样本输入12345
样本输出1014
解释
我们的初始数字是1、2、3、4和5
。我们可以使用五个整数中的四个来计算以下总和:
If we sum everything except 1, our sum is 2+3+4+5=14.
If we sum everything except 2, our sum is 1+3+4+5=13.
If we sum everything except 3, our sum is 1+2+4+5=12.
If we sum everything except 4, our sum is 1+2+3+5=11.
If we sum everything except 5, our sum is 1+2+3+4=10.
我的算法
for(i=0; i<arr.length; i++){
totSum += arr[i];
}
sumOne = totSum - arr[0];
sumTwo = totSum - arr[1];
sumThree = totSum - arr[2];
sumFour = totSum - arr[3];
sumFive = totSum - arr[4];
int[] num = {sumOne, sumTwo, sumThree, sumFour, sumFive};
int temp = 0;
for(i=0;i<num.length;i++){
for(int j=1;j<(num.length-i);j++){
if(num[j-1] > num[j]){
//swap elements
temp = num[j-1];
num[j-1] = num[j];
num[j] = temp;
}
}
}
System.out.print(num[0] + " " + num[4]);
对于(i=0;i您的想法是正确的(虽然排序数组有点过分,因为您只需要它的最大值和最小值),但是当您对这些大整数求和时,您使用sumtot
变量并得到错误的答案。使用long
s应该可以解决这个问题:
long totSum = 0;
for(int i=0; i<arr.length; i++){
totSum += arr[i];
}
long sumOne = totSum - arr[0];
long sumTwo = totSum - arr[1];
long sumThree = totSum - arr[2];
long sumFour = totSum - arr[3];
long sumFive = totSum - arr[4];
long[] num = {sumOne, sumTwo, sumThree, sumFour, sumFive};
long temp = 0;
for(int i=0;i<num.length;i++){
for(int j=1;j<(num.length-i);j++){
if(num[j-1] > num[j]){
//swap elements
temp = num[j-1];
num[j-1] = num[j];
num[j] = temp;
}
}
}
System.out.print(num[0] + " " + num[4]);
首先,您需要使用long,因为值的总和可以外推整数max值。
然后,您不需要双循环,并且可能因此而导致某些性能测试用例失败。请参阅此解决方案,它为2N解决方案执行两个独立的循环
package minmaxsum;
public class MinMaxSum {
public static void main(String[] args) {
MinMaxSum mms = new MinMaxSum();
mms.printMinMaxSum(new int[] {256741038, 623958417, 467905213, 714532089, 938071625});
// mms.printMinMaxSum(new int[] {1, 3, 5, 7, 9});
}
public void printMinMaxSum(int[] arr) {
long totalSum = 0;
for (int num : arr) {
totalSum += num;
}
long min = Long.MAX_VALUE;
long max = Long.MIN_VALUE;
for (int num : arr) {
long currentSum = totalSum - num;
min = Math.min(min, currentSum);
max = Math.max(max, currentSum);
}
System.out.println(min + " " + max);
}
}
这适用于所有测试用例。只需提交代码
static void miniMaxSum(int[] arr) {
Arrays.sort(arr);
long minSum=0,maxSum=0;
for(int i=0;i<4;i++){
minSum+=arr[i];
maxSum+=arr[arr.length-1-i] ;
}
System.out.println(minSum + " " + maxSum);
}
static void miniMaxSum(int[]arr){
数组。排序(arr);
长最小值=0,最大和=0;
对于(inti=0;i来说,需要改变思维方式:作为一名程序员,像机器一样思考通常比像人一样思考要好
问问你自己,没有一个元素的数组的最大和是什么?答案是除了最大值元素之外的所有元素的和。因此,如果你简单地找到具有最大值的元素,然后对其余元素求和,这是解决方案的第一部分。完全相同的逻辑适用于最小和
这样想可以减少解决问题的工作量和时间
例如,在一个循环中找到maximumElement和minimumElement
在第二个循环中,对两个结果求和-sumMax+=array[index]
避免使用maximumement的索引;summan+=array[index]
避免使用minimumElement的索引
当然,上面的所有工作都可以在一个循环中完成,但由于这是您提高编程技能的任务,我将把它留给您(以及编写代码)。以下是解决此问题的算法
算法-
步骤1我们将在数组中找到一个最小元素
步骤2我们将找到数组中的最大元素
步骤3我们将计算数组中所有元素的总和
步骤4我们通过从数组中的总和中减去最大值来计算最小值
步骤5我们通过从总和中减去最小值来计算最大和
最后,我们要打印minsum和maxsum
这是这个算法的实现
static void miniMaxSum(int[] arr) {
long min = 0, max = 0, sum = 0;
min = arr[0];
max = min;
sum = min;
for (int i = 1; i < arr.length; i++) {
sum += arr[i];
if (arr[i] < min) {
min = arr[i];
}
if (arr[i] > max) {
max = arr[i];
}
}
System.out.print((sum - max) + " " + (sum - min));
}
static void miniMaxSum(int[]arr){
长最小值=0,最大值=0,和=0;
min=arr[0];
最大值=最小值;
总和=最小值;
对于(int i=1;i最大值){
max=arr[i];
}
}
System.out.print((sum-max)+“”+(sum-min));
}
我希望这会有帮助。但是你仍然需要更多的解释,然后你可以参考这篇文章。你到底需要什么帮助?我正在试图找出我的代码在其余10个案例@MaruthiAdithya中失败的原因。因为你知道我们看不到所有的测试案例结果,但是,我添加了一个引起查询的输入,并使我的代码失败。请参阅在最后一行。@Alok将int
更改为long int
甚至尝试long long int
但您不认为排序也会给出我的答案,因为在打印中,我将第一个元素作为min,最后一个元素是max。没有任何区别@nomankhan嘿,我知道您的代码的意思,但我想问一下o一个问题,当第二个循环开始时,进入最小值和最大变量的值是什么?或者让我知道这个最小值=Long.max_值和最大值=Long.min_值有什么意义?Thanksmin从一个长变量的最大可能值开始。这样,当它与任何其他数字(如50L)进行比较时,它会请确保它将被该值替换。我们的想法是,我们将循环通过这些值,并在此过程中正确设置最小值和最大值。我尝试了我的方法,即循环到arr.length
,它给了我错误的答案。为什么会发生这种情况。因此,根据声明,我理解minSum是所有值的总和最大值应该是max num,反之亦然,所以我所做的是循环到arr.length
,并初始化static void miniMaxSum(int[] arr) {
long min = 0, max = 0, sum = 0;
min = arr[0];
max = min;
sum = min;
for (int i = 1; i < arr.length; i++) {
sum += arr[i];
if (arr[i] < min) {
min = arr[i];
}
if (arr[i] > max) {
max = arr[i];
}
}
System.out.print((sum - max) + " " + (sum - min));
}