图片表格内容识别转换-II - 华为机试真题题解(Java)

考试平台: 时习知

分值: 200分

考试时间: 两小时(共2题)

华为机试真题

题目描述

华为云推出了“通用表格识别”服务,可以将图片表格转换成文本数据。请你将文本数据进一步转换为“文本型表格”,如下图所示:

图片表格内容识别转换-II

输入

现给出一个图片表格的文本数据:

  • 每行数据形如 line3 col1 A,表示第3行第1列的单元格的内容为 A
  • 表格的行和列都从 1开始; 文本数据中行、列的最大值分别为表格的行、列数。
  • 内容为由英文字符A-Z组成的字符串,或为空;未描述的单元格内容为空。

请按如下格式要求,将文本数据转换成 [文本型表格]:

  • 表格第一行和最后一行用字母+和字母-组成,+代表单元格的间隔,-代表一个字符的占位符;

  • 数据行:

    • 用字符|标识单元格的左右边界。

    • 某一列的宽度是该列中所有单元格最长内容长度+2(即左右各补充 1个空格),该列中内容不足该宽度的用空格补充。

    • 表格中单元格的内容要求居中对齐,对齐要求:

      1. 尽量使得文本左右两侧的空格数量相等。
      2. 如果文本左右两侧的空格数量无法相等,则左侧比右侧少一个,如图中内容为 CN 的单元格。

输入

第一行一个整数num,表示文本数据的行数,范围[1,20]。
接下来num行字符串,每行格式如line2 col3 LMN描述一个单元格:

  • line 是行的固定前缀,行数范围[1,100];
  • col 是列的固定前缀,列数范围[1,100];
  • 内容为由英文字母A-Z组成的字符串,或为空,长度范围[0,10]。

输出

字符串表示的“文本型表格”。

示例1

输入:
8
line1 col3 CN
line1 col1 A
line1 col4 D
line3 col1 X
line2 col1
line2 col2 BE
line2 col3 LMN
line2 col4

输出:
+---+----+-----+---+
| A |    | CN  | D |
|   | BE | LMN |   |
| X |    |     |   |
+---+----+-----+---+

解释:
表格的行列数:
1)输入数据最大行为3,因此行数为 3 。
2)输入数据最大列为4,因此列数为 4 。

表格的各列宽度:
·第1列:内容最长为1,加2,该列宽度为3 。
·第2列:内容最长为2,加2,该列宽度为4 。
·第3列:内容最长为3,加2,该列宽度为5 。该列中内容LMN最长,左右各补充一个空格;CN左侧补充一个空格,右侧补充两个空格。
·第4列:内容最长为1,加2,该列宽度为3 。

示例2

输入:
2
line2 col2 A
line2 col3

输出:
+--+---+--+
|  |   |  |
|  | A |  |
+--+---+--+

解释:
从输入得到数据的行列数分别为2和3;第一行、第一列、第三列即使内容为空,也需要输出。
其中第一列内容都为空,列宽度为2(该列中所有单元格最长内容长度 +2)。           

题解

题目解读

该题目要求将图片表格的文本数据转换为特定格式的文本型表格。输入数据描述了表格的内容,输出要求格式化表格,具体要求如下:

  1. 表格的边框由 +- 组成。
  2. 表格单元格的内容居中对齐,不足的部分用空格填充。
  3. 每列的宽度为该列中最长内容的长度加上左右各一个空格。

解题思路

  1. 解析输入数据,确定表格的行数和列数。
  2. 计算每列的最大宽度,便于后续格式化单元格。
  3. 构建表格的边框、行数据和空格填充,使每个单元格内容居中对齐。
  4. 按照指定格式输出表格。

Java

import java.util.*;
public class Main {
    /**
     * 打印第一行和最后一行
     * @param cols
     * @param colWidth
     */
    public static void printHeader(int cols, int[] colWidth){
        List<String> data = new ArrayList();
        for(int c=1;c<=cols;c++){
            StringBuilder s = new StringBuilder();
            for(int i = 0; i < colWidth[c] + 2; i++){
                s.append('-');
            }
            data.add(s.toString());
        }

        StringBuilder line = new StringBuilder();
        line.append('+');
        line.append(String.join("+", data));
        line.append('+');
        System.out.println(line.toString());
    }

    /**
     * 打印数据行
     * @param rows 表格的行数
     * @param cols 表格的列数
     * @param colWidth 表格指定列的宽度
     * @param table 表格数据项
     */
    public static void printData(int rows, int cols, int[] colWidth, List<String[]> table){
        for(int r = 1; r <= rows; r++){
            List<String> list = new ArrayList();
            for(int c = 1; c <= cols; c++){
                String txt = table.get(r)[c];
                if(txt == null) txt = "";

                // 左侧的空格数量
                int ecnt1 = (colWidth[c] - txt.length()) / 2;
                StringBuilder sb = new StringBuilder();
                sb.append(' ');
                for(int i=0;i<ecnt1;i++) sb.append(' ');

                sb.append(txt);

                // 右侧的空格数量
                int ecnt2 = colWidth[c] - txt.length() - ecnt1;
                for(int i=0;i<ecnt2;i++) sb.append(' ');
                sb.append(' ');
                list.add(sb.toString());
            }

            StringBuilder line = new StringBuilder();
            line.append('|');
            line.append(String.join("|", list));
            line.append('|');
            System.out.println(line.toString());
        }
    }

    public static void main(String[] args) {
        int rows = 0, cols = 0;
        int colWidth[] = new int[105];
        List<String[]> table = new ArrayList();
        for(int i=0;i<105;i++) table.add(new String[105]);

        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt(); sc.nextLine();

        for(int i=0;i<n;i++){
            String[] sp = sc.nextLine().split(" ");
            int r = Integer.parseInt(sp[0].substring(4));
            int c = Integer.parseInt(sp[1].substring(3));
            String txt = (sp.length == 3) ? sp[2] : "";

            rows = Math.max(rows, r);
            cols = Math.max(cols, c);
            colWidth[c] = Math.max(colWidth[c], txt.length());
            table.get(r)[c] = txt;
        }

        printHeader(cols, colWidth);
        printData(rows, cols, colWidth, table);
        printHeader(cols, colWidth);
    }
}

🙏整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。🙏🙏🙏

  • 16
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

什码情况

你的鼓励就是我最大的动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值