Как проверить, была ли установлена ​​переменная int? - PullRequest
0 голосов
/ 24 мая 2018

Допустим, у меня есть переменная num.

Прежде чем я смогу оценить оператор if, мне нужно проверить, была ли эта переменная установлена ​​в первую очередь.Обычно я бы использовал -1, 0 или math.MaxInt32/math.MinInt32, но для этой задачи мне нужно проверить, установила ли моя программа свое значение.

Я пытался nums := nil и в своем выражении ifУ меня было что-то вроде if nums == nil || ....

Но при создании переменной nums я удивился, получив ошибку cannot convert nil to type int.Как мне добиться того, что я хочу сделать?

Чтобы было понятно: это leetcode question , и у него нет контроля над входами, они помещают всевозможные числа в includemath.MaxInt32, math.Идея заключалась в том, чтобы вместо этого использовать nil и поставить проверку в операторе if, но это не помогло, как указано выше.

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Как указано в комментариях, вы не можете проверить, был ли установлен 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

}
0 голосов
/ 24 мая 2018

Как отмечается в комментариях, нулевое значение для всех типов int в Go равно 0.Если 0 является возможным значением для числа, и вам необходимо проверить, было ли оно присвоено или нет, вам, вероятно, следует использовать тип Struct с некоторыми прикрепленными метаданными, а не тип примитива.

Как обычно для такого рода вопросов, в стандартной библиотеке для этого есть прецеденты.

Посмотрите на пустые типы пакета database / sql. Эти типы также оправдываютсяреализации Scanner, но вы можете использовать ту же идею в любое время, когда вам нужно проверить, должно ли примитивное значение действительно равняться Null, а не его нулевому значению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...