1.1. 题目
1.1.1. 整数反转
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0
1.1.2. 题解:
- 反转整数,就是把数按照相反的顺序重新排列
- 得注意是否超出了范围!
- 正常来说, 大于-10小于10的数,反转还是自己
1.1.3. 思路:
- 我尝试了两种方式,以前第一想法就是转换成字符串,然后字符串反向拼接,因为slice很好取数,然后再反转成整数
- 现在对递归比较熟练了,直接递归转,先对数 跟 10 取商,把商返给下一层,另外,数与10取余就是要的个体数
- 到最里面的时候,也就是以前的最高位现在是个数位,所以把最里层的数 m,然后返回 结果和 m 10,最后得到结果
1.1.4. 代码:
点击显示
func reverse(x int) int {
// 如果大于-10 且小于10 的 怎么反转都是自己,节约时间
if x > -10 && x < 10{
return x
}
a,_ := re(x,10)
if a > 2147483648 - 1 || a < -2147483648 {
return 0
}
return a
}
// 递归取数
func re(x int, k int) (res int,m int) {
// 把数 取余和整除,比如 12345 / 10 = 1234,然后取 1234 继续递归,得余数 5
// 继续 1234 / 10 得 123,余数4 ,继续递归
// ......
// 然后到最里面,也就是到了 12345的1的位置
// 把1 * 10 返回上一层,并把 10 * 10
// 然后就是 2 * 100 + 10(之前一层的结果)
// ...
// 5* 10000 + 4321 得出结果
s := x / k
rem := x % k
if s != 0 {
res,m = re(s,k)
} else {
// 最里面的时候,默认 m = 1,然后递归往回走,每层 * 10
m = 1
}
res = res + rem * m
return res,m*10
}
func reverse2(x int) int {
// 区分下这个数是正数还是负数
mius := 0
if x < 0 {
x = -x
mius = 1
}
// 转成字符串
xStr := strconv.Itoa(x)
newStr := ""
// 字符串拼接
for i:=len(xStr)-1;i>=0;i-- {
newStr = newStr + string(xStr[i])
}
// 反转后的字符串转整数,如果不成功,说明超出范围了,直接返回0
res,err := strconv.Atoi(newStr)
if err != nil {
return 0
}
// 判断临界点
power := 2147483648 - 1
if res > power {
return 0
}
// 根据 上面的界定,如果是负数,返回负数结果
if mius == 1 {
return -res
}
return res
}