一、题目描述
一个图像有 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"
五、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。哈哈~~
有的人会说,哪有这么简单的事情~~
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)(2022&2023)
本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。