华为2019秋招笔试Java实现(2)

本文介绍了华为2019秋招笔试中的一道题目,要求使用Java实现一种文本格式的表格数据解析算法。该格式涉及到逗号分隔字段、字符串的特殊存储规则等。解析过程包括验证字符串格式、计算字段数量、处理特殊字符和空格,以及输出每个字段的值。
摘要由CSDN通过智能技术生成

华为2019秋招笔试Java实现(2)

笔试日期2019年8月14日

第二题(200分)

题目描述

某程序员小A,有一种表格数据需要存储在文件中。表格中的每一行,由若干个字段组成,每个字段可以是整数或字符串(字符串只包含数字、字母以及特殊字符!@#%^&*()",)。小A设计了一种存储格式,采用文本的方式对表格数据进行存储。文本文件中的每一行,代表了表格数据中的一行数据。具体格式描述如下:

1、采用逗号分隔不同的字段(逗号前后无空格);

2、数字直接采用10进制的文本存储;

3、字符串的存储规则如下:

​ 1)如果字符串中包含逗号以及双引号,则字符串必须在头尾各增加一个双引号,且中间的双引号需要用连续两个双引号来表示。例如:“a,”“b”,表示字符串a,"b;

​ 2)如果字符串中未包含逗号以及双引号,则字符串不强制要求在头尾各增加一个双引号,可直接存储。例如:abc,或者"abc"都可以;

4、空字符串不存储任何字符,例如:a,b中,有3个字段,分别为a,空字符串,b;

请帮助小A设计一个算法,用来将单行文本,解析成多个字段,并输出。

输入描述

用于存储单行表格数据的一行文本。

输出描述

如果输入字符串格式不正确,则输出结束。

如果字符串格式正确,则输出每个字段的值,每个字段单独占一行。数字采用10进制输出,字符串输出接卸后的值。

空字符串输出–

示例

输入

a,,1,"b,"""

输出

4
a
--
1
b,"

分析

这个解析过程可以认为是括号解析问题的变种,只是处理过程较为复杂,主要涉及以下几个处理。

1、字符串格式验证
观察可以发现,题目中对格式的要求只有第三条的第一小点,也就是双引号的问题。那么怎么判断格式对不对呢?其实不难,按题目要求,双引号的数量必须是偶数,只要统计双引号数量即可。

2、字段数量
这个就是分割的问题,考虑到逗号会出现在字符串中,不能直接统计逗号数量,要统计未被双引号包住的逗号数量。就像括号成对一样,这里的双引号也要成对。那直接拿堆栈来做,在遇到逗号和引号时做判断,其它字符存到临时字符串变量中。

1)逗号

  • 堆栈顶为逗号(或为空),将当前保存的临时字符串存到列表中,删除最后一个引号

  • 堆栈顶为引号,把逗号加到临时字符串尾部

2)引号

  • 堆栈顶为逗号(或为空),把引号压入堆栈
  • 堆栈顶为引号,删除堆栈顶引号,把一个引号加到临时字符串尾部

引号总是成对出现,所以保留第二个引号即可,而一个字段中的头尾引号是作为格式,不出现在字符串中,所以要删除最后一个引号。

3、特殊字符
在处理特殊字符时要记得加上转义符号,不然程序跑不出你期望的结果。

4、空格表示
题目中明确说,空格要转换成–(两个减号),也简单,就是最后输出的时候替换一下就行,或者塞进列表前替换一下。

5、总结
总的来说,这题的考点比较明确,不过作为笔试题过于繁琐,需要考虑的细节很多,会花很多时间,需要比较高的熟练度,也需要从括号解析问题类推。

解答

// 这代码在if条件判断处写的很乱,我也懒得重写,有兴趣的可以按照上述思路自己写一遍
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值