题目描述
边界比较需要考虑,而且还有不允许64位整数的要求。
解法 & 代码
① 字符串解法
起初想到的做法,不过缺点比较多 首先用到了long,实际上不允许使用,修改的话做法参考②的溢出判断 估计比较慢,类型转换了很多次。
class Solution { public int reverse ( int x) { if ( x == Integer . MIN_VALUE) { return 0 ; } int flag = 1 ; if ( x < 0 ) { flag = - 1 ; x = - x; } StringBuilder sb = new StringBuilder ( new Integer ( x) . toString ( ) ) ; long ans = Long . parseLong ( sb. reverse ( ) . toString ( ) ) * flag; if ( ans> Integer . MAX_VALUE || ans< Integer . MIN_VALUE) { ans = 0 ; } return ( int ) ans; }
}
② 类栈做法
看了题解,感觉应该是栈。 两个if:分别在不适用long的前提下进行了上下溢出的判断,-8 & 7对应极限值。 每次pop出最末尾的数字,然后push到新的“栈”上。
class Solution { public int reverse ( int x) { int nowNum = 0 ; while ( x != 0 ) { int pop = x % 10 ; x /= 10 ; if ( nowNum > Integer . MAX_VALUE / 10 || ( nowNum == Integer . MAX_VALUE / 10 && pop > 7 ) ) { return 0 ; } if ( nowNum < Integer . MIN_VALUE/ 10 || ( nowNum == Integer . MIN_VALUE && pop < - 8 ) ) { return 0 ; } nowNum = nowNum * 10 + pop; } return nowNum; }
}
时间复杂度O(log(x)) ,大概循环lg(x)次。空间复杂度O(1) 。