解法都在代码里,不懂就留言或者私信
这个题排在字节跳动半年榜的第64题,但是题目确实远非如此,我知道的最近一个月至少考过4次,还是必须掌握的
class Solution {
public int reverse(int x) {
/**一位的整数,不管是整数还是负数,没有什么可反转的,反转了和自己也一样 */
if(x >= -9 && x <= 9) {
return x;
}
/**负数的承载范围比较大,统一转换为负数处理,转换之前记录一下是否为正数
如果是正数,最后的结果取相反数 */
boolean isPositive = x > 0;
x = isPositive? -x : x;
/**基本思路是按照每次取余然后乘在高位,然后往高位一位一位取余重复操作
这个过程中一定要注意是否超过了int的范围,比如Integer.MAX_VALUE和MIN_VAVLUE相反之后都会超出
超出直接返回0*/
/**当前数到了多少*/
int curNum = 0;
/**记录两个值minLastDigitNum和minDivide10分别表示Integer.MIN_VALUE%10和Integer.MIN_VALUE/10
之后的值,这个值用于反转过程中的越界判断 */
int minLastDigitNum = Integer.MIN_VALUE % 10;
int minDivide10 = Integer.MIN_VALUE /10;
while(x != 0) {
/**要计算的下一位 */
int curDigitNum = x %10;
/**任何一种发生都说明要越界了,越界就返回0 */
if(curNum < minDivide10 || (curNum == minDivide10 && curDigitNum < minLastDigitNum)) {
return 0;
}
/**使用之前的结果*10+当前位 */
curNum = curNum * 10 + curDigitNum;
x = x / 10;
}
/**最后根据正负数确认最终结果,正数的注意处理越界 */
return isPositive? (curNum == Integer.MIN_VALUE? 0 : -curNum) : curNum;
}
}
这种题估计写出来的都是最优解吧,哈哈