我在Golang中试图找到两个等长字符串之间的公共元素。
找到了元素,但是字符串表示似乎也包含了字节值。我该如何去掉它呢?
func main() {
println(fmt.Printf("common element = %s",
findCommonElement("abcdefghi", "ijklmnopq")))
}
func findCommonElement(firstElements, secondElements string) string {
elementsInFirstGroup := make(map[string]bool)
for _, charValue := range firstElements {
elementsInFirstGroup[string(charValue)] = true
}
for index := range firstElements {
if _, ok := elementsInFirstGroup[string(secondElements[index])]; ok {
matchingElem := secondElements[index]
println(string(matchingElem))
return string(matchingElem)
}
}
panicMessage := fmt.Sprintf("Could not find a common item between %s and %s", firstElements, secondElements)
panic(panicMessage)
}
我得到的输出是
i
common element = i18 (0x0,0x0)
代码可用here
1条答案
按热度按时间brtdzjyr1#
您应该使用
fmt.Sprintf
而不是fmt.Printf
。避免使用内置的
println
,而使用fmt.Println
。https://pkg.go.dev/fmt@go1.19.3#Printf
Printf根据格式说明符格式化并写入标准输出。它返回写入的字节数和遇到的任何写入错误。
因此
18 (0x0,0x0)
...18
是字符串"common element = i"
中的字符数。(0x0,0x0)
是println
打印的nil
错误值。然而更重要的是,你的算法是有缺陷的,因为它混淆了字节和符文。当你对一个字符串执行
range
时,迭代变量charValue
将被赋值为rune
,它可能是多字节的。然而当你索引一个字符串时(如secondElements[index]
)的结果总是单一的byte
.所以死机或乱码(无效字节)将不可避免地成为你的函数的结果.参见example .执行以下操作可能会获得更好的结果:
https://go.dev/play/p/kNotThOrehj