Сохраните их на карте и попробуйте номер, стоимость которого вы ищете.Если номер (ключ) отсутствует на карте, обрежьте его последнюю цифру и повторите.Таким образом, если вы найдете совпадение, гарантируется, что он будет самым длинным префиксом.
Вот пример функции поиска:
var prefixCostMap = map[uint64]float64{
44: 0.01597,
447: 0.04958,
447530: 0.03,
447531: 0.048,
447532: 0.04950,
1: 0.1,
97: 0.1,
}
func lookup(num uint64) (longestPrefix uint64, cost float64, ok bool) {
longestPrefix = num
for longestPrefix > 0 {
cost, ok = prefixCostMap[longestPrefix]
if ok {
break
}
longestPrefix = longestPrefix / 10 // Cut off last digit
}
return
}
Тестирование:
fmt.Println(lookup(4475122112))
fmt.Println(lookup(4475302112))
fmt.Println(lookup(999))
Вывод(попробуйте на Go Playground ):
447 0.04958 true
447530 0.03 true
0 0 false
Примечание: это не поддерживает числа, начинающиеся с 0. Если вам также нужно обрабатывать это, вы можете сохранить числа в виде строкизначения, поэтому начальные 0
цифры будут сохранены.
Вот как выглядит версия string
:
var prefixCostMap = map[string]float64{
"44": 0.01597,
"447": 0.04958,
"447530": 0.03,
"447531": 0.048,
"447532": 0.04950,
"1": 0.1,
"97": 0.1,
"0123": 0.05,
}
func lookup(num string) (longestPrefix string, cost float64, ok bool) {
longestPrefix = num
for longestPrefix != "" {
cost, ok = prefixCostMap[longestPrefix]
if ok {
break
}
longestPrefix = longestPrefix[:len(longestPrefix)-1] // Cut off last digit
}
return
}
Тестирование:
fmt.Println(lookup("4475122112"))
fmt.Println(lookup("4475302112"))
fmt.Println(lookup("999"))
fmt.Println(lookup("0123456"))
Вывод (попробуйте на Go Playground ):
447 0.04958 true
447530 0.03 true
0 false
0123 0.05 true