Как указано в комментариях, вы не можете проверить, был ли установлен int
или нет.
И использование math.MinInt32
в качестве значения сигнала не удастся, если вы получите это на входе.
Поэтому, если вы хотите реализовать его таким образом, единственный вариант - использовать указатели (*int
).
С помощью указателей вы можете проверить, установлены ли они, потому что они начинаются сnil
значение, как вы ожидаете.
Однако логика становится немного более сложной, чем вы реализовали, так как вам нужно работать с указателями и ссылками.
Ниже приведена возможная реализация, пытаясьиспользуйте ту же логику, которую вы опубликовали, только меняя указатели.
Другой вариант - просто отсортировать массив и поработать с отсортированными элементами, чтобы найти третий.
Ссылка на игровую площадку: https://play.golang.org/p/ro_NIrDEo_s
func thirdMax(nums []int) int {
dict := make(map[int]int, 0)
// these will start with "nil values"
var maxOne *int
var maxTwo *int
var maxThree *int
for _, value := range nums {
if maxOne == nil || value >= *maxOne && dict[value] < 1 {
maxThree = maxTwo
maxTwo = maxOne
maxOne = new(int)
*maxOne = value
}else if maxTwo == nil || value >= *maxTwo && dict[value] < 1{
maxThree = maxTwo
maxTwo = new(int)
*maxTwo = value
} else if maxThree == nil || value >= *maxThree && dict[value] < 1 {
maxThree = new(int)
*maxThree = value
}
dict[value] += 1
}
if maxOne == nil {
panic("does not work with empty input array!")
}
if maxTwo == nil {
return *maxOne
}
if maxThree == nil {
return *maxTwo
}
return *maxThree
}