我的代码中的逻辑工作,因为我已经通过了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,因此永远不满足返回MAX
或MIN
的条件。
因此,为了改进这一点,您可以从使用strtol
而不是返回signed long
而不是signed int
的atoi
开始。这样可以为比较提供更大的数据大小,然后可以恢复到检查字符串长度,以拒绝比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 }