华为OD机试真题 Java 实现【简单的自动曝光】【2023Q1 100分】,附详细解题思路

在这里插入图片描述

目录

    • 专栏导读
    • 一、题目描述
    • 二、输入描述
    • 三、输出描述
    • 四、备注
    • 五、解题思路
    • 六、Java算法源码
    • 七、效果展示
      • 1、输入
      • 2、输出
      • 3、说明
      • 4、再输入
      • 5、输出
      • 6、说明

华为OD机试 2023B卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

一个图像有 n 个像素点,存储在一个长度为 n 的数组 img 里,每个像素点的取值范围[0,255]的正整数。

请你给图像每个像素点值加上一个整k(可以是负数),得到新图 newlmg,使得新图 newlmg 的所有像素平均值最接近中位值 128。

请输出这个整数 k。

二、输入描述

n 个整数,中间用空格分开。

三、输出描述

一个整数 k。

四、备注

1 <= n <= 100。

如有多个整数 k 都满足,输出小的那个 k;

新图的像素值会自动截取到[0,255]范围。当新像素值<0,其值会更改为0,当新像素值>255,其值会更改为 255:例如 newlmg=”-1 -2 256”,会自动更改为”0 0 255"

五、解题思路

  1. 读取输入的整数数组 nums;
  2. 初始化变量 num 为数组长度,表示像素点的个数;
  3. 初始化变量 diff 为最大值,用于记录当前差值的绝对值;
  4. 初始化变量 ret 为 null,用于记录最小差值对应的整数 k;
  5. 使用循环遍历 k的取值范围从 -127 到 128;
    • 计算每个取值 k 对应的新图像像素值总和 sum;
    • 对于每个像素值,将其加上 k 并进行范围限制,使得新像素值在 [0, 255] 范围内;
    • 更新 sum 为新图像像素值的总和;
    • 计算当前平均值与中位值 128 的差值的绝对值 tempDiff;
    • 如果 tempDiff 小于 diff,更新 diff 为 tempDiff,并更新 ret 为当前 k;
    • 如果 tempDiff 等于 diff 且 ret 不为 null,说明存在多个整数 k 满足条件,选择较小的 k 更新 ret;
  6. 输出结果 ret;

六、Java算法源码

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    String str = sc.nextLine();
    int[] nums = Arrays.stream(str.split(" ")).mapToInt(Integer::parseInt).toArray();

    // 输入数字个数
    int num = nums.length;
    double diff = Integer.MAX_VALUE;

    Integer ret = null;
    for (int k = -127; k <= 128; k++) {
        double sum = 0;
        for (Integer val : nums) {
            int temp = val + k;
            // 像素大于255时,取255
            temp = Math.min(temp, 255);
            // 像素小于0时,取0
            temp = Math.max(0, temp);
            sum += temp;
        }

        double tempDiff = Math.abs(sum / num - 128);
        if (tempDiff < diff) {
            diff = tempDiff;
            ret = k;
        } else if (tempDiff == diff && ret != null) {
            // 多个整数 k 都满足,返回小的
            ret = Math.min(ret, k);
        }
    }
    System.out.println(ret);
}

七、效果展示

1、输入

0 0 0 0

2、输出

128

3、说明

每个加128,都为128,最接近128。哈哈~~

华为OD机试真题 Java 实现【简单的自动曝光】【2023Q1 100分】,附详细解题思路_第1张图片

有的人会说,哪有这么简单的事情~~

4、再输入

120 122 130 150

5、输出

-3

6、说明

当为-2时,变为118 120 128 148,中位数是128.5。

当为-3时,变为117 119 127 147,中位数是127.5。

输出较小的数-3。

华为OD机试真题 Java 实现【简单的自动曝光】【2023Q1 100分】,附详细解题思路_第2张图片


下一篇:华为OD机试真题 Java 实现【路灯照明问题】【2022Q4 100分】,感谢fly晨发现这个问题,并提供更优质的算法

本文收录于,华为OD机试(JAVA)真题(A卷+B卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

你可能感兴趣的:(搬砖工逆袭Java架构师,华为od,java,程序人生,数据库,算法)