考试平台: 时习知
分值: 200分
考试时间: 两小时(共2题)
题目描述
华为云推出了“通用表格识别”服务,可以将图片表格转换成文本数据。请你将文本数据进一步转换为“文本型表格”,如下图所示:
输入
现给出一个图片表格的文本数据:
- 每行数据形如 line3 col1 A,表示第3行第1列的单元格的内容为 A
- 表格的行和列都从 1开始; 文本数据中行、列的最大值分别为表格的行、列数。
- 内容为由英文字符A-Z组成的字符串,或为空;未描述的单元格内容为空。
请按如下格式要求,将文本数据转换成 [文本型表格]:
-
表格第一行和最后一行用字母+和字母-组成,+代表单元格的间隔,-代表一个字符的占位符;
-
数据行:
-
用字符|标识单元格的左右边界。
-
某一列的宽度是该列中所有单元格最长内容长度+2(即左右各补充 1个空格),该列中内容不足该宽度的用空格补充。
-
表格中单元格的内容要求居中对齐,对齐要求:
- 尽量使得文本左右两侧的空格数量相等。
- 如果文本左右两侧的空格数量无法相等,则左侧比右侧少一个,如图中内容为 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)。
题解
题目解读
该题目要求将图片表格的文本数据转换为特定格式的文本型表格。输入数据描述了表格的内容,输出要求格式化表格,具体要求如下:
- 表格的边框由
+
和-
组成。- 表格单元格的内容居中对齐,不足的部分用空格填充。
- 每列的宽度为该列中最长内容的长度加上左右各一个空格。
解题思路
- 解析输入数据,确定表格的行数和列数。
- 计算每列的最大宽度,便于后续格式化单元格。
- 构建表格的边框、行数据和空格填充,使每个单元格内容居中对齐。
- 按照指定格式输出表格。
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