给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
我的解法:将整形转换成字符串,判断首位是否是“-”,再将字符串反转,注意判断是否在在整形范围以内。
let str = "\(x)"
let array = Array(str)
let firstStr = array[0]
if firstStr == "-"{
let intStr = str[str.index(str.startIndex, offsetBy: 1)...]
if -Int(String(intStr.reversed()))! < Int32.min{
return 0
}else{
return -Int(String(intStr.reversed()))!
}
}else{
if Int(String(str.reversed()))! > Int32.max{
return 0
}else{
return Int(String(str.reversed()))!
}
}
查看他人的解法:初始化一个result为0,将原来的值%10之后算出每一位值,加上result * 10就可以实现反转。
func reverse(_ x: Int) -> Int {
guard x >= Int32.min && x <= Int32.max else {
return 0
}
var target = x
let negative = target < 0
if negative{
target *= -1
}
var result = 0
while target > 0{
result = result &* 10 &+ target % 10 //值溢出运算符是为了防止32位环境下溢出
target /= 10
}
guard result > 0 else{
return 0
}
if negative{
result *= -1
}
return result >= Int32.min && result <= Int32.max ? result : 0
}
学到的知识:溢出运算符可以防止溢出
- &+ 溢出加法
- &- 溢出减法
- &* 溢出乘法
- &/ 溢出除法
- &% 溢出求余