我正在尋找一種在字串中查找重復字符的解決方案,并且我對具有按位運算的解決方案感興趣。
我發現了這種按位運算的變體。但在其中,搜索發生在 ASCII 表的范圍 az 中。
func HasDuplicates(str string) (string, bool) {
checker := 0
for _, char := range str {
val := char - 'a'
fmt.Println(val)
if (checker & (1 << val)) > 0 {
fmt.Printf("'%c' is Duplicate\n", char)
return str, false
}
checker |= 1 << val
}
return str, true
}
是否可以像上面的示例一樣,僅針對隨機 unicode 字串(象形文字、表情符號等)制定通用解決方案?
uj5u.com熱心網友回復:
使用big.Int作為位集:
func HasDuplicates(str string) (string, bool) {
var bits big.Int
for _, char := range str {
val := int(char)
fmt.Println(val)
if bits.Bit(val) != 0 {
fmt.Printf("'%c' is Duplicate\n", char)
return str, false
}
bits.SetBit(&bits, val, 1)
}
return str, true
}
https://go.dev/play/p/kS-OxYPts5G
這有多有效將取決于 big.Int 的實作,您無法像在簡單整數上使用按位運算時那樣控制它。
您也可以使用布爾映射,盡管它不再是按位運算:
func HasDuplicates(str string) (string, bool) {
var bits = make(map[int]bool)
for _, char := range str {
val := int(char)
fmt.Println(val)
if bits[val] {
fmt.Printf("'%c' is Duplicate\n", char)
return str, false
}
bits[val] = true
}
return str, true
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/485179.html
上一篇:golang速率限制每分鐘
下一篇:格式化json資料或生成動態結構
