LOADING STUFF...
世界已冷酷至极, 让我们携手前行。
自助收录

2023年华为OD机考真题:简单的自动曝光

算法刷题1年前 (2023)更新 江南白衣
387 0 0
2023年华为OD机考真题:简单的自动曝光

全网最全面的华为OD机试真题汇总,100%原题题库,不需要开会员即可查看全部内容,更多考题请查看真题库。

真题库:https://www.yuque.com/codernav.com/od

题目:简单的自动曝光
时间限制:1s 空间限制:256MB 限定语言:不限
题目描述:
一个图像有n个像素点,存储在一个长度为n的数组img里,每个像素点的取值范围[0,255]的正整数。
请你给图像每个像素点值加上一个整数k(可以是负数),得到新图newImg,使得新图newImg的所有像素平均值最接近中位值128。
请输出这个整数k。
输入描述:
n个整数,中间用空格分开
例如:
0 0 0 0
4个数值,中间用空格分开
输出描述:
一个整数k
补充说明:
• 1 <= n <= 100
• 如有多个整数k都满足,输出小的那个k;
• 新图的像素值会自动截取到[0,255]范围。当新像素值<0,其值会更改为0;当新像素值>255,其值会更改为255;
例如newImg=”-1 -2 256″,会自动更改为”0 0 255″
示例1
输入:
0 0 0 0
输出:
128
说明:
四个像素值都为0
示例2
输入:
129 130 129 130
输出:
-2
说明:
-1的均值128.5,-2的均值为127.5,输出较小的数-2
解题思路:
求输入数组的值的总和
求出数组的平均值(使用double保留小数)
平均值 – 128 求出其差值
如果差值是小数则需要进行四舍五入
需要考虑到newImg的值小于0
需要对步骤4的数字进行取反

代码实现一:

package com.codernav.demo.hwod.exam;

import java.util.Scanner;

/**
 * @title 简单的自动曝光
 * @Description 一个图像有n个像素点,存储在一个长度为n的数组img里,每个像素点的取值范围[0,255]的正整数。
 * 请你给图像每个像素点值加上一个整数k(可以是负数),得到新图newImg,使得新图newImg的所有像素平均值最接近中位值128。
 * 请输出这个整数k。
 * @Author 开发者导航
 * @website https://codernav.com
 * @date 2023/5/13
 */
public class Main {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        String[] strs = sc.nextLine().split(" ");
        int len = strs.length;

        double count = 0;   //输入值总和
        for (String s : strs) {
            int num = Integer.parseInt(s);
            count += num;
        }

        double averages = count / len - 128;  //平均差
        int res;
        if (averages >= 0) {
            res = (int) Math.round(averages);   //对平均差进行四舍五入
        } else {
            res = (int) (-Math.round(-averages));
        }

        int lessThenZeroNum = 0;    //newImg小于0的个数
        int lessThenZero = 0;    //newImg小于0的与0的差值的和
        for (String str : strs) {
            int num = Integer.parseInt(str);
            if (num - res < 0) {    //考虑到newImg的值小于0
                lessThenZeroNum++;
                lessThenZero += num - res;
            }
        }
        res -= lessThenZero / (len - lessThenZeroNum);
        System.out.println(-res);    //取反
    }

}

代码实现二:

package com.codernav.demo.hwod.exam;

import java.util.Scanner;

/**
 * @title 简单的自动曝光
 * @Description 一个图像有n个像素点,存储在一个长度为n的数组img里,每个像素点的取值范围[0,255]的正整数。
 * 请你给图像每个像素点值加上一个整数k(可以是负数),得到新图newImg,使得新图newImg的所有像素平均值最接近中位值128。
 * 请输出这个整数k。
 * @Author 开发者导航
 * @website https://codernav.com
 * @date 2023/5/13
 */
public class Main {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        String[] s = sc.nextLine().split(" ");
        int n = s.length;
        int[] a = new int[n];
        for (int i = 0; i < n; i++) {
            a[i] = Integer.parseInt(s[i]);
        }
        //所有数字的和
        int sum = 0;
        for (int v : a) sum += v;
        //和与中位数的差值
        int ans = Math.abs(sum - 128 * n);
        int res = 0;
        for (int i = -255; i <= 255; i++) {
            int t = 0;
            for (int j = 0; j < n; j++) {
                //模拟出k值为-255--255的所有可能和
                t += Math.max(Math.min(a[j] + i, 255), 0);
            }
            int dis = Math.abs(t - 128 * n);
            //找出差值最小的k值
            if (dis < ans) {
                ans = dis;
                res = i;
            }
        }
        System.out.println(res);
    }
}
© 版权声明

相关文章

开发者导航新手教程

暂无评论

暂无评论...