面试题答案
一键面试package main
import (
"fmt"
"strconv"
"strings"
)
func parseSpecialStr(s string) string {
var result strings.Builder
i := 0
for i < len(s) {
if s[i] == '\\' {
if i+1 < len(s) {
switch s[i+1] {
case 'n':
result.WriteRune('\n')
case 't':
result.WriteRune('\t')
case '\\':
result.WriteRune('\\')
// 可以继续添加其他转义字符的处理
default:
// 处理八进制转义字符 \ooo(o 为八进制数字)
if '0' <= s[i+1] && s[i+1] <= '7' {
num := 0
count := 0
for ; i+1 < len(s) && '0' <= s[i+1] && s[i+1] <= '7' && count < 3; i, count = i+1, count+1 {
num = num*8 + int(s[i+1]-'0')
}
i--
result.WriteRune(rune(num))
} else if s[i+1] == 'x' && i+3 < len(s) {
// 处理十六进制转义字符 \xhh(h 为十六进制数字)
num, err := strconv.ParseInt(s[i+2:i+4], 16, 32)
if err == nil {
result.WriteRune(rune(num))
i += 3
}
} else {
result.WriteRune(s[i+1])
}
}
i++
}
} else {
result.WriteByte(s[i])
}
i++
}
return result.String()
}
你可以使用以下方式调用这个函数:
func main() {
testStr := "Hello\\nWorld\\t\\x41\\101"
fmt.Println(parseSpecialStr(testStr))
}
代码说明
- 字符串解析循环:通过一个
for
循环遍历输入字符串s
。 - 转义字符处理:当遇到
\
字符时,检查下一个字符,根据不同的转义字符(如\n
、\t
、\\
等)进行相应处理。 - 八进制和十六进制转义字符处理:对于八进制转义字符
\ooo
和十六进制转义字符\xhh
也进行了解析处理。 - 非转义字符处理:如果当前字符不是
\
,直接将其写入结果字符串。 - 使用
strings.Builder
:为了提高效率,使用strings.Builder
来构建结果字符串,避免在循环中频繁的字符串拼接操作。