C语言,面试题分享(阿里),简单算法

面试题分享

题目要求:

  • 输入数组,大小为n,包含 n 个整数;
  • 再输入一个整数 k,可以给数组中任意整数加 1,总共可以加 k 次;
  • 加完 k次后,找到数组中的最大值;
  • 最后输出得一个最小的最大值。

题目分析

需要输出最小的最大值,每次+1就都需要分摊到数组中;
思路:

  1. 先需求得数组中的最大值记为max;
  2. 求得最大值和所有数组中的数的差值的合记为sum;
  3. sum即为总偏差值,判断sum和k的大小
  • 若(k <= sum) ==> 最终结果(result)就为 max;
  • 若(k > sum) ==> 最终结果就得看 k - sum 的值了;

C语言,面试题分享(阿里),简单算法

k - sum 和数组元素个数(n)
result = max + ((k - sum) % n)+ num
若是 ((k - sum) % n ) != 0
num = 1
否则
num = 0

代码实现

#include 
#include 

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;
}
版权声明:如无特殊标注,文章均来自网络,本站编辑整理,转载时请以链接形式注明文章出处,请自行分辨。

本文链接:https://www.shbk5.com/dnsj/72049.html