面试题答案
一键面试function parseComplexString(str: string): { [key: string]: string } {
const result: { [key: string]: string } = {};
let key = '';
let value = '';
let inValue = false;
let escaped = false;
for (let i = 0; i < str.length; i++) {
const char = str[i];
if (!inValue) {
if (char === ':') {
inValue = true;
} else {
key += char;
}
} else {
if (escaped) {
value += char;
escaped = false;
} else {
if (char === '\\') {
escaped = true;
} else if (char === ';') {
result[key] = value;
key = '';
value = '';
inValue = false;
} else {
value += char;
}
}
}
}
// 处理最后一组键值对
if (key && value) {
result[key] = value;
}
return result;
}
解析过程
-
初始化变量:
result
用于存储最终解析的对象。key
和value
分别用于临时存储当前解析的键和值。inValue
标记当前是否正在解析值。escaped
标记当前字符是否是转义字符后的字符。
-
遍历字符串:
- 当
!inValue
时,即正在解析键,遇到:
则开始解析值,将inValue
设为true
,否则继续累加字符到key
。 - 当
inValue
时:- 如果
escaped
为true
,则将当前字符累加到value
并将escaped
设为false
。 - 如果当前字符为
\
,则将escaped
设为true
。 - 如果当前字符为
;
且escaped
为false
,则表示一组键值对结束,将当前key
和value
存入result
,并重置key
和value
,将inValue
设为false
。 - 其他情况,直接将字符累加到
value
。
- 如果
- 当
-
处理最后一组键值对:遍历结束后,如果
key
和value
都有值,则将最后一组键值对存入result
。
边界情况处理
- 字符串结尾没有
;
:在遍历结束后通过检查key
和value
是否都有值,确保最后一组键值对也能正确解析。 - 空字符串:直接返回空对象
{}
,若传入的str
为空,上述代码逻辑会直接返回空对象,因为没有字符可解析。
优化思路
- 减少内存分配:尽量减少中间变量的创建和销毁,这里通过复用
key
、value
等变量来减少不必要的内存开销。 - 避免多次遍历:采用一次遍历的方式,在遍历过程中直接完成解析,而不是先进行预处理再解析,提高效率。