面试题分享
题目要求:
- 输入数组,大小为n,包含 n 个整数;
- 再输入一个整数 k,可以给数组中任意整数加 1,总共可以加 k 次;
- 加完 k次后,找到数组中的最大值;
- 最后输出得一个最小的最大值。
题目分析
需要输出最小的最大值,每次+1就都需要分摊到数组中;
思路:
- 先需求得数组中的最大值记为max;
- 求得最大值和所有数组中的数的差值的合记为sum;
- sum即为总偏差值,判断sum和k的大小
- 若(k <= sum) ==> 最终结果(result)就为 max;
- 若(k > sum) ==> 最终结果就得看 k - sum 的值了;
k - sum 和数组元素个数(n)
result = max + ((k - sum) % n)+ num
若是 ((k - sum) % n ) != 0
num = 1
否则
num = 0
代码实现
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int n,//数组长度
k,//给定k
result;//最终结果
int max = 0;
//申请出数组空间 n个int型大小
scanf_s("%d", &n);
scanf_s("%d", &k);
printf("n = %d k = %d\n",n,k);
int* point = (int*)malloc(sizeof(int) * n);
if(NULL == point)
{
return 0;
}
//数组赋初值
for (int i = 0; i < n; i++)
{
scanf_s("%d", (point + i));
}
//打印数组
for (int i = 0; i < n; i++)
{
printf("%d\t", *(point + i));
}
for (int i = 1; i < n; i++)
{
max = *(point + i - 1);
if (*(point + i) > max)
{
max = *(point + i);
}
}
printf("\nmax is %d", max);
int sum = 0;
int temp = 0;
for (int i = 0; i < n; i++)
{
temp = max - *(point + i);
sum += temp;
}
printf("\nsum = %d", sum);
if (k <= sum)
{
result = max;
}
else//k >sum
{
int delete_num ;
int live_num,//存储商的值
reminder;//存储余数
//如果给定的k大于sum 补完了差值 k -sum后还剩的还要继续加,那么就要比较k-sum 和n的大小了
delete_num = k - sum;
live_num = delete_num / n;
reminder = delete_num % n;//0 ---- (n - 1)
if (reminder != 0)
{
live_num++;
}
result = max + live_num;
}
printf("\nresult is %d\n",result);
system("pause");
return 0;
}