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

本文分享了一道程序设计面试题,要求在给定整数数组和加次数k的情况下,通过加1操作使数组最大值最小。解题思路包括计算数组最大值、所有元素与最大值的差值之和,然后根据k与差值的关系确定最小最大值。代码实现了该算法,输出了最小化后的最大值。
摘要由CSDN通过智能技术生成

面试题分享

题目要求:

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

题目分析

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

  1. 先需求得数组中的最大值记为max;
  2. 求得最大值和所有数组中的数的差值的合记为sum;
  3. 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;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值