我刚刚开始在HackerRank上练习以提高我的编码技能。我主要使用Java作为首选语言。我有这个问题,我已经尽我最大的努力给出了解决方案,但并未清除所有测试用例。 我已经清除了15个测试用例中的5个,但仍有10个要处理。那些在hackerrank上的人可以通过以下链接查看问题:Min-Max Sum
我无论如何都在简要说明问题:
问题声明
给出五个正整数,找到可以通过对五个整数中的四个精确求和而得出的最小值和最大值。然后将相应的最小值和最大值打印为两个空格分隔的长整数的单行。
例如,arr=[1,3,5,7,9]
。我们的最小和为1+3+5+7=16
,最大为3+5+7+9=24
。我们将打印16 24
输出格式
打印两个以空格分隔的长整数,分别表示可以通过对五个整数中的四个精确求和而得出的最小值和最大值。 (输出可以大于32位整数。)
样本输入 1 2 3 4 5
示例输出 10 14
说明
我们的初始号码是1, 2, 3, 4, and 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]);
我们还可以通过遍历num array
并找到最大值和最小值来做到这一点。
但是毕竟以某种方式,我不会清除此模块。
请注意: arr中的元素数固定为5。
我已经知道在10个失败案例中,我了解了一个测试用例,就像这样:
输入(标准输入)
256741038 623958417 467905213 714532089 938071625
预期产量
2063136757 2744467344
答案 0 :(得分:2)
您有一个正确的想法(尽管对数组进行排序有点过大,因为您只需要其最大值和最小值),但是当您对这些大整数求和时,您overflow {{1} }变量并得到错误答案。使用sumtot
可以解决问题:
long
请注意,顺便说一句,使用Java 8的流,您可以实现相同的逻辑并保存很多样板代码以及O(nlog(n))排序:
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]);
答案 1 :(得分:1)
首先,您需要使用long,因为值的总和可以外推整数最大值。 然后,您不需要双重循环,因此您可能无法通过一些性能测试案例。请参阅此解决方案,该解决方案针对2N解决方案执行两个分离的循环。
urlpatterns = [
path('home/', views.index, name='admin_index'),
path('berita/', views.BeritaList.as_view(), name='all_berita'),
]
答案 2 :(得分:1)
这适用于所有测试用例。刚刚提交了代码
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);
}
并非所有测试用例都对数据进行了排序。 数组排序后,单循环足以计算最小和最大和。 排序有助于将时间复杂度从O(n * n)降低到O(nlogn)
答案 3 :(得分:0)
有必要改变思维方式:因为程序员通常比像人一样像机器一样思考。
问问自己,没有一个元素的数组的maximumSum是多少?答案是除最大值元素外的所有元素的总和。因此,如果您简单地找到具有最大值的元素,然后将其余元素相加,则这是解决方案的第一部分。完全相同的逻辑适用于minimumSum ...
这种想法减少了解决问题的精力和时间。
例如-在一个循环中找到maximumElement和minimumElement。
在第二个循环中,将两个结果相加-sumMax += array[index]
避免了maximumElement的索引; sumMin += array[index]
避免使用minimumElement的索引。
当然,以上所有内容都可以在一个循环中完成,但是由于这是提高编程技能的任务,因此我将把它留给您(以及编写代码)。
答案 4 :(得分:0)
这是解决此问题的算法。
算法-
第1步,我们将在数组中找到一个最小元素。
步骤2 ,我们将在数组中找到最大元素。
第3步,我们将计算数组中所有元素的总和。
第4步,我们正在通过从数组中的总和中减去最大值来计算最小和。
步骤5 ,我们正在通过从总和中减去最小值来计算最大和。
最后,我们将打印最小和最大。
这是该算法的实现。
ffmpeg -ss 600 -i 01x01TheStrongestMan.mp4 -to 660 -vcodec copy -acodec copy -y outputxxx.mp4
我希望它会有所帮助。但是仍然需要更多说明,您可以参阅此tutorial。