华为OD机试真题---简单的自动曝光

一、题目描述

一个图像有n个像素点,存储在一个长度为n的数组img里,每个像素点的取值范围是[0,255]的正整数。要求找到一个整数k,使得给图像每个像素点值加上k后,新图像newimg的所有像素平均值最接近中位值128。输出这个整数k。

二、解题思路

  1. 读取输入:首先读取输入的整数数组,即图像的像素点值。

  2. 初始化变量

    • num:表示像素点的个数,即数组的长度。
    • diff:用于记录当前差值的绝对值,初始化为最大值。
    • ret:用于记录最小差值对应的整数k,初始化为null。
  3. 遍历k的取值范围:由于k可以是负数,且考虑到像素值的范围在[0,255],因此k的取值范围可以设定为[-127,128]。遍历这个范围,计算每个k值对应的新图像像素值的平均值,并找出最接近128的平均值对应的k值。

  4. 计算新图像像素值:对于每个像素值,将其加上k,并进行范围限制,确保新像素值在[0,255]范围内。如果新像素值小于0,则更改为0;如果大于255,则更改为255。

  5. 更新差值:计算新图像像素值的总和,并求出平均值。计算该平均值与128的差值(取绝对值),如果比当前的diff小,则更新diff和ret。

  6. 输出结果:遍历结束后,输出ret,即为所求的整数k。

三、代码实现(Java示例)

以下是一个Java实现的示例代码:

package cn.gov.test.gt4.swjggl.leetcode;

import java.util.Arrays;

public class ImageAdjuster {

    /**
     * 找到一个整数k,使得给定图像每个像素点值加上k后,新图像的像素平均值最接近128。
     *
     * @param img 原始图像的像素数组,每个像素值范围在[0, 255]
     * @return 整数k,使得调整后的图像平均值最接近128
     */
    public static Integer adjustImage(int[] img) {
        // 初始化变量
        int num = img.length; // 图像像素点数量
        int diff = Integer.MAX_VALUE; // 初始差值设为最大值
        Integer ret = null; // 最终返回的结果k,默认为null

        // 遍历所有可能的k值
        for (int k = -127; k <= 128; k++) {
            // 计算新图像像素值
            int sum = 0;
            for (int pixel : img) {
                int newPixel = Math.max(0, Math.min(255, pixel + k));
                sum += newPixel;
            }

            // 计算新图像的平均值并更新差值
            int avg = sum / num;
            int currentDiff = Math.abs(avg - 128);
            if (currentDiff < diff) {
                diff = currentDiff;
                ret = k;
            }
        }

        return ret; // 输出结果
    }

    public static void main(String[] args) {
        int[] img = {50, 100, 150, 200}; // 示例输入
        System.out.println("调整图像所需的k值为:" + adjustImage(img));
    }
}

四、注意事项

  1. 输入格式:输入为n个整数,表示图像的像素点值,中间用空格分开。
  2. 输出格式:输出一个整数k,使得新图像的像素平均值最接近128。
  3. 边界条件:注意处理k的取值范围以及新像素值的范围限制。
华为OD机试真题-学生重新排队是一个典的编程问题,下面是问题和解决路: 问题描述: 有n个学生站成一排,每个学生都有一个独一无二身份ID。现在给定一个初始的学生排列顺序,以及一系列的交换操作,交换操作表示将两个学生的位置进行交换。请你编写一个算法,输出最终的学生排列顺序。 解决思路: 这个问题可以使用数组来表示学生的排列顺序。首先,我们需要根据初始的学生排列顺序构建一个映射表,将每个学生的ID与其在数组中的位置对应起来。然后,我们按照给定的交换操作,更新映射表中学生的位置信息。最后,根据更新后的映射表,构建最终的学生排列顺序。 具体步骤如下: 1. 构建映射表:遍历初始的学生排列顺序,将每个学生的ID与其在数组中的位置对应起来,可以使用哈希表来实现。 2. 执行交换操作:按照给定的交换操作,更新映射表中学生的位置信息。 3. 构建最终的学生排列顺序:根据更新后的映射表,构建最终的学生排列顺序。 下面是一个示例代码,用于解决这个问题: ```python def rearrange_students(initial_order, swap_operations): # 构建映射表 mapping = {} for i, student_id in enumerate(initial_order): mapping[student_id] = i # 执行交换操作 for swap in swap_operations: student1, student2 = swap mapping[student1], mapping[student2] = mapping[student2], mapping[student1] # 构建最终的学生排列顺序 final_order = [0] * len(initial_order) for student_id, position in mapping.items(): final_order[position] = student_id return final_order ``` 使用上述代码,你可以通过传入初始的学生排列顺序和交换操作,得到最终的学生排列顺序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值