解析字符串

一、前言

昨天一个朋友在应聘一家公司,公司给了他一道字符串解析的问题,按照自己的思路记录一下。

 

二、题目

/**
* 目标:解析字符串(完成时间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 题意中需求

  1. 对字符串进行解析,解析成多组数据,每组数据由key—value构成数据对
  2. 每组数据划分是通过 & 进行划分,如果 & 是转义字符,则 \& 只能看着普通的字符&
  3. 每组数据对是通过 = 进行划分,如果 = 是转义字符,则 \= 只能看着普通的字符=
  4. 过滤掉 ‘\0’
  5. 支持转义字符定义
  6. 支持容错处理

3.2 待确定需求

由于题目是朋友给的,里面有一些情况无法通过题意和实例进行确认,待确定的问题如下:

  1. 如果key值有重复需要怎样处理?
  2. 对于正常的字符格式应该是 = & = & 交替出现,如果 = = 或者 & & 连续出现,需要怎样处理?
  3. 对于正常的字符格式应该是 = & = & 交替出现,= 前面为空,或者 = 与 & 之间为空,或者 & 与 = 之间为空 需要怎样处理?

自己暂时处理方法:

  1. 问题一,key值重复出现后面的会覆盖掉前面的value值,并打印提示信息
  2. 问题二,若 = 或 & 重复出现,根据当前遍历终止节点进行查找,若需要遍历一个key值则需要遍历到=为止,若为空则当前数据组无效,例如 a=b&=c,第一组数据是(a,b), 第二组数据key为空,value为c,第二组数据无效
  3. 问题三,处理方法和问题二一样

3.3 闲谈

在实际工作中,需要先明确需求,再开始设计和编码。需求不明确一切都白忙。这里无法询问不确定需求就先按照自己的理解进行实现。

 

四、思路

接下来说到的 = &,指划分字符。

4.1 初步设计方案

上面需求分析完,思路基本也就清晰了。

  1. 按照 & 进行划分 获得一组有效的数据组
  2. 对一组数据进按照 = 划分获得 key-value
  3. 过滤key-value值中的 ‘\0’ 和 转义字符
  4. 循环执行这个过程即可

4.2 优化方案

  1. 按照 = 和 & 划分获取 key值和 value值
  2. 过滤key-value值中的 ‘\0’ 和 转义字符
  3. 循环执行这个过程

由于 = & 是交替出现了,那么我们可以将4.1中的步骤1和步骤2进行合并,也就是实现一个函数它们在遇到 = 或者 & 时 终止遍历并返回字符串。程序实现如下:

    // 解析一对数据
    pair
在SQL中解析字符串数组可以采用多种方法。以下是一些常用的解析方法: 1. 使用内置函数:SQL中有一些内置函数可以用于解析字符串数组。例如,可以使用STRING_SPLIT函数将包含多个值的字符串拆分为多个行,每行表示一个值。例如,如果有一个字符串'1,2,3,4,5',可以使用STRING_SPLIT将其拆分为如下的结果集: 值 1 2 3 4 5 2. 使用正则表达式:有些DBMS支持使用正则表达式解析字符串数组。可以使用正则表达式函数(如REGEXP_SUBSTR)从包含多个值的字符串中提取所需的值。例如,如果有一个字符串'1,2,3,4,5',可以使用REGEXP_SUBSTR函数提取其中的每个值。 3. 使用自定义函数:如果DBMS不支持内置函数或正则表达式,可以编写自定义函数来解析字符串数组。自定义函数可以根据特定的规则或分隔符将字符串拆分为多个值,并返回一个表或结果集,其中每行表示一个值。 无论使用哪种方法,解析字符串数组的关键是确定数组的格式和分隔符。如果数组中的值之间使用逗号分隔,那么以上方法都可以使用。如果数组中的值之间使用其他分隔符(如分号、竖线等),需要相应调整解析方法中的函数或规则。 综上所述,SQL可以通过内置函数、正则表达式或自定义函数来解析字符串数组,具体方法取决于DBMS的功能和要解析字符串数组的格式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值