华为OD机试 2024D卷题库疯狂收录中,刷题点这里
专栏导读
本专栏收录于《华为OD机试(JAVA)真题(D卷+C卷+A卷+B卷)》。
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。
一、题目描述
黑白图像常采用灰度图的方式存储,即图像的每像素填充一个灰阶值,256阶灰度图是个灰阶值取值范围为0-255的灰阶矩阵,0表示全黑,255表示全白,范围内的其他值表示不同的灰度,比如下面的图像及其对应的灰阶矩阵:
但在计算机中实际存储时,会使用压缩算法,其中一种压缩格式和描述如下:10 10 255 34 0 1 255 8 0 3 255 6 0 5 255 4 0 7 255 2 0 9 255 21
- 有数值以空格分隔
- 前两个数分别表示矩阵的行数和列数
- 从第三个数开始,每两个数一组,每组第一个数是灰阶值,第二个数表示该灰阶值以左到右,从上到下(可理解为将二维数组按行存储在一维矩阵中)的连续像素个数。比如题目所述例子,255 34表示有连续34个像素的灰阶值是255。如此,图像软件在打开此格式灰度图的时候,就可以根据此算法从压缩数据恢复出原始灰度图矩阵。
请从输入的压缩数据恢复灰度图原始矩阵,并返回指定像素的灰阶值。
二、输入描述
输入包括两行,第一行是灰度图压缩数据,第二行表示一个像素位置的行号和列号,如 0 0 表示左上角像素
三、输出描述
一个数字,表示输入数据表示的灰阶矩阵的指定像素的灰阶值。
补充说明
- 系统保证输入的压缩数据是合法有效的,不会出现数据越界、数值不合法等无法恢复的场景
- 系统保证输入的像素坐标是合法的,不会出现不在矩阵中的像素
- 矩阵的行和列数范围为: (0, 100]
- 灰阶值取值范围为 [0,255]
1、输入
10 10 255 34 0 1 255 8 0 3 255 6 0 5 255 4 0 7 255 2 0 9 255 21
3 4
2、输出
0
3、说明
四、解题思路
为了恢复灰度图并找到指定像素位置的灰阶值,可以按照以下步骤进行:
- 解析输入:
- 第一个输入行表示压缩的灰度图数据。
- 第二个输入行表示要查询的像素位置(行号和列号)。
- 构建灰度矩阵:
- 根据压缩数据的描述,逐组解析每个灰阶值和其对应的连续像素个数。
- 使用一个一维数组(线性方式)存储灰度值,并逐步填充。
- 找到指定像素的灰阶值:
- 根据行号和列号计算该像素在一维数组中的位置,并返回对应的灰阶值。
五、Java算法源码
public class Test01 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 读取第一行压缩的灰度图数据,并分割为字符串数组
String[] compressedData = scanner.nextLine().split(" ");
// 第一个数表示矩阵的行数,第二个数表示矩阵的列数
int rows = Integer.parseInt(compressedData[0]);
int cols = Integer.parseInt(compressedData[1]);
// 读取第二行要查询的像素位置,并分割为行号和列号
String[] position = scanner.nextLine().split(" ");
int targetRow = Integer.parseInt(position[0]);
int targetCol = Integer.parseInt(position[1]);
// 计算目标位置在一维数组中的索引
int targetIndex = targetRow * cols + targetCol;
// 初始化变量,currentIndex用于跟踪当前处理的位置,result用于存储目标像素的灰阶值
int currentIndex = 0;
int result = 0;
// 从第三个数开始,每两个数一组解析压缩数据
for (int i = 2; i < compressedData.length; i += 2) {
// 第一个数是灰阶值
int grayValue = Integer.parseInt(compressedData[i]);
// 第二个数是该灰阶值的连续像素个数
int count = Integer.parseInt(compressedData[i + 1]);
// 判断目标索引是否在当前灰阶值的范围内
if (currentIndex + count > targetIndex) {
// 如果是,则目标像素的灰阶值就是当前的灰阶值
result = grayValue;
break;
}
// 否则,更新currentIndex,继续处理下一个灰阶值和像素个数
currentIndex += count;
}
// 输出目标像素的灰阶值
System.out.println(result);
// 关闭扫描器
scanner.close();
}
}
六、效果展示
1、输入
10 10 56 34 99 1 87 8 99 3 255 6 99 5 255 4 99 7 255 2 99 9 255 21
3 4
2、输出
99
3、说明
🏆下一篇:华为OD机试 - 简易内存池 - 逻辑分析(Java 2024 C卷 200分)
🏆本文收录于,华为OD机试(JAVA)真题(D卷+C卷+A卷+B卷)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。