一、前言
昨天一个朋友在应聘一家公司,公司给了他一道字符串解析的问题,按照自己的思路记录一下。
二、题目
/**
* 目标:解析字符串(完成时间48小时内)
* 格式: src="t1a=t1b&t2a=t2b&t3a=t3b"
* 结果: map[t1a]=t1b,map[t2a]=t2b,map[t3a]=t3b
* 要求: 1>使用辅助类型TokenizerEx(测试源文件中包含Tokenizer.h Tokenizer.cpp),可以使用STL中任何数据结构和算法
* 2>由于格式中有'='和'&',但是要求t1a和t1b中可能也会有这两个字符,于是用 "\=" "\&" 代替 '=' '&'
* 3>需要转义的字符不限于 "\=" "\&", 有可能会增加 "\?" 等其他字符
* 4>支持容错处理并过滤掉'\0'字符,比如 src="&t1a=t1b&t2a=t2b" 或 src="&t1a=t1b&" 或 src="" 的情况均可正常运行
* 5>代码注释齐全,代码逻辑简洁,尽可能考虑效率问题
* 示例: "\\?124\0=34\\&5\\&&xy\0\\&=45\\=\n\\?" 应被解析为 map["?124"]="34&5&",map["xy&"]="45=\n?"
* 说明: 这是当前项目中的一个实际问题,考察面试者
* 1>代码阅读能力
* 2>独立解决问题的能力
* 3>代码质量(可阅读性,效率)
* 4>做事的认真程度以及耐心程度
* 建议: 如果代码逻辑考虑不周全,提前时间完成并不会得到更好的测试成绩
* 后续: 此测试通过后,来项目组阅读项目中关于这个问题的实现代码并进一步面试(面试时间可能会比较久,请面试者做好心理准备)
*/
三、需求分析
接下来说到的 = &,指划分字符。
3.1 题意中需求
- 对字符串进行解析,解析成多组数据,每组数据由key—value构成数据对
- 每组数据划分是通过 & 进行划分,如果 & 是转义字符,则 \& 只能看着普通的字符&
- 每组数据对是通过 = 进行划分,如果 = 是转义字符,则 \= 只能看着普通的字符=
- 过滤掉 ‘\0’
- 支持转义字符定义
- 支持容错处理
3.2 待确定需求
由于题目是朋友给的,里面有一些情况无法通过题意和实例进行确认,待确定的问题如下:
- 如果key值有重复需要怎样处理?
- 对于正常的字符格式应该是 = & = & 交替出现,如果 = = 或者 & & 连续出现,需要怎样处理?
- 对于正常的字符格式应该是 = & = & 交替出现,= 前面为空,或者 = 与 & 之间为空,或者 & 与 = 之间为空 需要怎样处理?
自己暂时处理方法:
- 问题一,key值重复出现后面的会覆盖掉前面的value值,并打印提示信息
- 问题二,若 = 或 & 重复出现,根据当前遍历终止节点进行查找,若需要遍历一个key值则需要遍历到=为止,若为空则当前数据组无效,例如 a=b&=c,第一组数据是(a,b), 第二组数据key为空,value为c,第二组数据无效
- 问题三,处理方法和问题二一样
3.3 闲谈
在实际工作中,需要先明确需求,再开始设计和编码。需求不明确一切都白忙。这里无法询问不确定需求就先按照自己的理解进行实现。
四、思路
接下来说到的 = &,指划分字符。
4.1 初步设计方案
上面需求分析完,思路基本也就清晰了。
- 按照 & 进行划分 获得一组有效的数据组
- 对一组数据进按照 = 划分获得 key-value
- 过滤key-value值中的 ‘\0’ 和 转义字符
- 循环执行这个过程即可
4.2 优化方案
- 按照 = 和 & 划分获取 key值和 value值
- 过滤key-value值中的 ‘\0’ 和 转义字符
- 循环执行这个过程
由于 = & 是交替出现了,那么我们可以将4.1中的步骤1和步骤2进行合并,也就是实现一个函数它们在遇到 = 或者 & 时 终止遍历并返回字符串。程序实现如下:
// 解析一对数据
pair