首页 > 编程语言 >图片表格内容识别转换-II - 华为机试真题题解(Java)

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

时间:2024-08-08 17:26:14浏览次数:18  
标签:表格 真题 int 题解 单元格 cols II colWidth 文本

考试平台: 时习知

分值: 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);
    }
}

标签:表格,真题,int,题解,单元格,cols,II,colWidth,文本
From: https://blog.csdn.net/user_longling/article/details/141032328

相关文章

  • STM32之IIC协议
    物理层 1.从机数量选择地址限制:IIC协议本身没有严格规定总线上device最大数目,从理论上看,IIC能挂的device数目取决于能表示的最大地址空间,在7位地址模式下,减去0x00地址不可用,理论上可以挂2^7-1=127个设备。总线电容限制:由于器件的管脚都是有输入电容的,PCB上......
  • 20240808题解
    话说T2写了个动态树结果考场调不出来,这下大炮打蚊子了。森林(forest)题面:符合条件的森林中深度相同的点度数相同,\(1\lei\len\),求点数为\(i\)的符合条件的森林的种类数。题解:将森林中每一个根节点连到同一个节点上变成一棵树。令\(f(i)\)表示符合条件的树的种类数,那么\(f(i......
  • SSY20240805提高组T2题解
    题干描述题目描述给定一个长度为......
  • UnicodeEncodeError:“ascii”编解码器无法对位置 20 中的字符 u'\xa0' 进行编码:序号
    我在处理从不同网页(在不同站点上)获取的文本中的unicode字符时遇到问题。我正在使用BeautifulSoup。问题是错误并不总是可重现的;它有时适用于某些页面,有时,它会因抛出UnicodeEncodeError而呕吐。我已经尝试了几乎所有我能想到的方法,但我还没有找到任何可以一致工作......
  • Crash 的旅行计划 / 蓝色彼岸花 题解
    前言题目链接:Hydro&bzoj。题意简述一棵\(n\)个结点的树上,每个点有点权,有\(m\)次操作:修改\(u\)的点权;查询以\(u\)为一端的简单路径的点权和最大值。对于\(20\%\)的数据:\(n,m\leq10^3\);对于另\(30\%\)的数据:第\(i\)条边连接\(i\)和\(i+1\);对于......
  • 洛谷 P1019 [NOIP2000 提高组] 单词接龙 题解
    暴搜!!暴搜!!暴搜!!重要的事情说三遍#include<bits/stdc++.h>usingnamespacestd;constintN=25;intn,ans,use[N];strings,word[N];voiddfs(strings){intls=s.size();//s的lengthans=max(ans,ls);//求出最长的单词接龙for(inti=0;i<n......
  • 洛谷P2404 自然数的拆分问题——题解
    洛谷P2404题解传送锚点摸鱼环节自然数的拆分问题题目描述任何一个大于\(1\)的自然数\(n\),总可以拆分成若干个小于\(n\)的自然数之和。现在给你一个自然数\(n\),要求你求出\(n\)的拆分成一些数字的和。每个拆分后的序列中的数字从小到大排序。然后你需要输出这些序列......
  • 【题解】Solution Set - NOIP2024集训Day2 线段树
    【题解】SolutionSet-NOIP2024集训Day2线段树https://www.becoder.com.cn/contest/5431「CF1149C」TreeGenerator™结论:对于括号序列的一个子段,删去所有的匹配括号之后,剩下的不匹配的括号,按顺序构成树上的一条路径。Why?从括号序列的构造出发。每次(相当于开始遍历......
  • 嵌入式实时操作系统(RT-Thread、FreeRTOS、UCOSIII)
    实时操作系统(RT-Thread、FreeRTOS、UCOSIII)文章目录`实时操作系统(RT-Thread、FreeRTOS、UCOSIII)``专有名词概念``1、什么是嵌入式``嵌入式系统的特点``2、什么是实时``3、什么是操作系统``操作系统主要功能和特性``常见的操作系统类型包括``4、嵌入式实时操作系统``关......
  • python joblib.load 发生错误:协议 0 中的持久 ID 必须是 ASCII 字符串 在 GCP 云运行
    总体而言:我尝试使用Cloudbuild和Cloudrun构建BERT模型。我将模型(参数)和元数据(标签)保存在GCPCloudStorage中。但是,我遇到了通过joblib.load()加载metadata.bin文件的错误。我的metadata.bin文件包含UTF-8字符,但joblib.load需要ASCII字符。在......