Строка в целое число (atoi) max целочисленная проблема в Swift - PullRequest
0 голосов
/ 03 августа 2020

Лог c в моем коде работает, поскольку я прошел 1000 испытаний в leetcode, но когда в мою программу вставлен ввод «20000000000000000000», он возвращает 0, хотя у меня есть следующий код.

let MAX: Int = 2147483647
let MIN: Int = -2147483648

if answer > MAX { return MAX }
if answer < MIN { return MIN }

Я не понимаю, почему мой код не может обрабатывать этот конкретный ввод, поскольку он может обрабатывать любое число ниже этого. Спасибо за помощь.

1 Ответ

0 голосов
/ 03 августа 2020

Вы выходите за пределы Int таким значением, как 20000000000000000000. Следовательно (и это предположение, поскольку вы не предоставили код, в котором answer задается значение), если answer устанавливается из значения atoi("20000000000000000000"), answer никогда не будет больше 2147483647 или меньше -2147483648, поскольку знаковый Int не может содержать значения за пределами этого диапазона. Вместо этого оно будет отображаться как число где-то в пределах этого диапазона, который представляет собой 0, который вы видите, и поэтому никогда не удовлетворяет условию возврата либо MAX, либо MIN.

Следовательно, чтобы улучшить это , вы можете начать с использования strtol вместо atoi, которое возвращает signed long, а не signed int. Это дает вам больший размер данных для сравнения, и затем вы можете вернуться к проверке длины строки, чтобы отклонить строки для большего количества символов (цифр), чем в значениях MAX или MIN.

strtol функция подпись: strtol(__str: UnsafePointer<Int8>!, __endptr: UnsafeMutablePointer<UnsafeMutablePointer<Int8>?>!, __base: Int32)

Что может быть использовано в следующем:

let input = "20000000000000000000"

let MAX: Int = 2147483647
let MIN: Int = -2147483648

if input.count > 11 && input.hasPrefix("-") {
    return MIN
}
else if input.count > 10 {
    return MAX
}

let answer = strtol(input, nil, 0)

if answer > MAX { return MAX }
if answer < MIN { return MIN }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...