
华为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在线答疑。




















