Swift中的字符串到整数(atoi)最大整数问题



我的代码中的逻辑工作,因为我已经通过了leetcode中的1000次测试,但当输入"20000000000000000000";插入到我的程序中时返回0,即使我有以下代码。

let MAX: Int = 2147483647
let MIN: Int = -2147483648
if answer > MAX { return MAX }
if answer < MIN { return MIN }

我不明白为什么我的代码不能处理那个特定的输入,因为它可以处理低于这个数字的任何数字。谢谢你的帮助。

您正在用20000000000000000000之类的值溢出Int的极限。因此(这是一个假设,因为您还没有提供将answer设置为值的代码(,如果从atoi("20000000000000000000")的值设置answer,则answer将永远不会大于2147483647或小于-2147483648,因为带符号的Int不能保持超过该范围的值。相反,它将显示为该范围内的某个数字,即您看到的0,因此永远不满足返回MAXMIN的条件。

因此,为了改进这一点,您可以从使用strtol而不是返回signed long而不是signed intatoi开始。这样可以为比较提供更大的数据大小,然后可以恢复到检查字符串长度,以拒绝比MAXMIN值中更多的字符(数字(。

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 }

最新更新