【发布时间】:2022-06-19 17:08:17
【问题描述】:
我已经尝试在 HackerRank 上解决这个问题
给定五个正整数,找出可以通过将五个整数中的四个恰好相加来计算的最小值和最大值。然后将各自的最小值和最大值打印为一行,由两个空格分隔的长整数组成。
例子
arr[5] = [1,3,5,7,9]
最小和为 1+3+5+7=16,最大和为 3+5+7+9=24。函数打印
16 24
...test0 和 test1 工作正常:
测试0
输入(标准输入)
1 2 3 4 5
预期输出
10 14
Test14
输入(标准输入)
7 69 2 221 8974
预期输出
299 9271
在测试用例期间,我的代码未能通过 10/15 测试,例如:
测试2
输入(标准输入)
396285104 573261094 759641832 819230764 364801279
预期输出
2093989309 2548418794
Test10
输入(标准输入)
501893267 649027153 379408215 452968170 487530619
预期输出
1821800271 2091419209
这是我的代码,我在哪里以及做错了什么?
void swap(int *p1, int *p2){
int tmp = *p1;
*p1 = *p2;
*p2 = tmp;
}
void selectionSort(int *arr, int arr_count)
{
int i, j, minIndex;
for(i=0; i<arr_count;i++){
minIndex = i;
for(j=i+1; j<arr_count; j++){
if(arr[j]<arr[minIndex]){
minIndex = j;
}
}
swap(&arr[minIndex],&arr[i]);
}
}
void miniMaxSum(int arr_count, int* arr) {
int i;
int max1=0, max2=0, genericSum=0;
selectionSort(arr, arr_count);
for(i=0; i<arr_count; i++){
genericSum += arr[i];
}
max1 = genericSum - arr[0];
max2 = genericSum - arr[arr_count-1];
printf("%d %d", max2, max1);
return;
}
也许问题出在数据的类型上,因为在主 arr 中初始化为 int 但使用 long 可能会更好...
【问题讨论】:
-
不需要排序,交换,... - 只需将所有五个值相加,然后从总和中分别减去每个值并记住最小值和最大值,就是这样 - 与 O( n log(n)) 与 最佳 排序,O(n²) 与选择排序。
-
旁注:指定数组大小的正确类型是
size_t,而不是int... -
您的
genericSum超出了int的最大值。
标签: arrays c sorting sum minimax