题目描述:
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
示例一
输入:x = 123
输出:321
示例二
输入:x = -123
输出:-321
示例三
输入:x = 120
输出:21
示例四
输入:x = 0
输出:0
提示
思路分析
转字符串
此方法...
嗯 ...
怎么说呢
大概是因为本菜没有一颗算法的心 哈哈哈
弹出和推入数字 & 溢出前进行检查
本方法名来自官方
首先我们要反转一个整数,只要我们能拿到这个整数的 末尾数字 就可以了。
以 12345 为例,先拿到 5,再拿到 4,之后是 3,2,1,我们按这样的顺序就可以反向拼接处一个数字了,也就能达到 反转 的效果。
怎么拿末尾数字呢?好办,用取模运算就可以了
怎么判断溢出呢?分两种
- 一个是大于整数最大值
MAX_VALUE - 另一个是小于整数最小值
MIN_VALUE
假设当前计算结果为result,下一位为pop。
-
从result * 10 + pop > MAX_VALUE这个溢出条件来看
当出现 result > MAX_VALUE / 10 且 还有pop需要添加 时,则一定溢出
当出现 result == MAX_VALUE / 10 且 pop > 7 时,则一定溢出,7是2^31 - 1的个位数 -
从result * 10 + pop < MIN_VALUE这个溢出条件来看
当出现 result < MIN_VALUE / 10 且 还有pop需要添加 时,则一定溢出
当出现 result == MIN_VALUE / 10 且 pop < -8 时,则一定溢出,8是-2^31的个位数
复杂度分析
时间复杂度:,x 中大约有 位数字。
空间复杂度:。
AC代码
class Solution {
fun reverse(x: Int): Int {
var copy = x
var result = 0
while (copy != 0) {
val pop = copy % 10
if (result > Int.MAX_VALUE / 10 || (result == Int.MAX_VALUE / 10 && pop > Int.MAX_VALUE % 10)) {
return 0
}
if (result < Int.MIN_VALUE / 10 || (result == Int.MIN_VALUE / 10 && pop < Int.MIN_VALUE % 10)) {
return 0
}
result = result * 10 + pop
copy = copy / 10
}
return result
}
}
附上大佬另一个写法
class Solution {
fun reverse(x: Int): Int {
var copy = x
var result = 0
while (copy != 0) {
val last = copy % 10
val temp = result * 10 + last
if ((temp -last) /10 !=result) {
return 0
}
result = temp
copy = copy / 10
}
return result
}
}
总结
好像这题也不存在什么暴力解法的,本题的正统思路应该还是走数学路线,通过计算,并注意 溢出 问题,应该就很好解决。
后来也看了不少答案,大多数差异就在判断溢出的条件上。
再接再厉。
本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情