一、题目:
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。假设环境不允许存储 64 位整数(有符号或无符号)。
示例 1:
输入:x = 123
输出:321
二、解题思路:
- 题意理解: 给定一个32 位的有符号整数 x,将数字倒排,如果倒排后是值不在32有符号整数范围内就返回0。
- 解题思路: 将该整数转为字符串,先排除符号,利用StringBuilder根据索引将字符倒过拼接,拼接后处理无效0的字符,之后转为int类型,用try,catch抓取异常如果有异常说明反转后的数不在32有符号整数范围内返回0即可代码如下:
class Solution { public int reverse(int x) { boolean falg = false;//符号标识为负数时 flag = true String str = String.valueOf(x); if (str.startsWith("-")){ // 去除符号 str = str.substring(1); falg = true; } StringBuilder reverse = new StringBuilder(); int length = str.length(); for (int i = length -1; i >= 0; i--) { //倒过来拼接字符 reverse.append(str.charAt(i)); } str = String.valueOf(reverse); for (int i = 0; i < str.length() - 1 ; i++) { // 去除反转后无效的数字0 if (!"0".equals(String.valueOf(str.charAt(i)))){ str = str.substring(i); break; } } if (falg){ str = "-" + str; } try { x = Integer.parseInt(str);//有异常说明反转后的数值不在 [−231, 231 − 1] 范围内返回 0 } catch (NumberFormatException e) { return 0; } return x; } }
大佬解法:
class Solution { public int reverse(int x) { int res = 0; while(x!=0) { //每次取末尾数字 int tmp = x%10; //判断是否 大于 最大32位整数 if (res>214748364 || (res==214748364 && tmp>7)) { return 0; } //判断是否 小于 最小32位整数 if (res<-214748364 || (res==-214748364 && tmp<-8)) { return 0; } res = res*10 + tmp; x /= 10; } return res; } }