手机网站建设广告推销网站
描述
给定一个32位的有符号整数num,将num中的数字部分反转,最后返回反转的结果
1.只反转数字部分,符号位部分不反转
2.反转后整数num超过 32 位的有符号整数的范围 [−231, 231 − 1] ,返回 0
3.假设本题不允许存储 64 位整数(有符号或无符号,即C++不能使用long long ,Java不能使用long等)
数据范围:
-2 ^31 <= x <= 2 ^31-1
示例1
输入:12
返回值:21示例2
输入:-123
返回值:-321示例3
输入:10
返回值:1示例4
输入:1147483649
返回值:0
思路:采用字符串的形式倒过来,最后判断形参决定是否为负数并返回。
import java.util.*;public class Solution {/**** @param x int整型* @return int整型*/public int reverse (int x) {// write code hereif (x > Math.pow(2, 31) - 1 || x < Math.pow(-2, 31)) return 0;String str = Math.abs(x) + "";String val = "";for (int i = str.length() - 1; i >= 0; i--) {val += str.charAt(i);}int result = Integer.parseInt(val);return x > 0 ? result : -result;}
}
原因:进入Integer引用类型类中时,可以看到该类对象值为-2 ^ 31 -----2 ^ 31之间。输入是没有问题的,但是输出时,这个值就大于2 ^ 31了,因此报错。
解决方案:采用long的形式定义值,随后强制转换返回值(int)n==n?(int)n:0
但是当x = -2^ 31时,该值用Math.abs通过绝对值以后还是负数,由于变更符号导致又返回负数。
因此,判断定义为绝对值后是否为负数,若为负数则直接返回0,由于反转也还是0。
最后代码版本:
import java.util.*;public class Solution {/**** @param x int整型* @return int整型*/public int reverse (int x) {// write code hereString str = Math.abs(x) + "";if (x > Math.pow(2, 31) - 1 || x < Math.pow(-2, 31) || Integer.parseInt(str)<0) return 0;String val = "";for (int i = str.length() - 1; i >= 0; i--) {val += str.charAt(i);}int a=5;long result = Long.parseLong(val);result = x > 0 ? result : -result;return (int)result == result ? (int)result : 0;}
}
方法二,采用数学公式的方式。
每次都取余10表示最后一个值放在最前面。(该方法由于没有使用太多java内置函数,没有那么多坑)
import java.util.*;public class Solution {/**** @param x int整型* @return int整型*/public int reverse (int x) {// write code herelong n = 0;while(x!=0){n = n*10 + x % 10;x = x/10;}return (int)n==n?(int)n:0;}
}