整数反转7&&int与double的转换使用
在做leetcode第7题的时候,有用到有关int与double的转换
题目如下:
给你一个 32 位的有符号整数 x ,返回 x 中每位上的数字反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-integer
(一)初次看到这个题的时候,心里第一反应是将数据转化为字符串,再反转(这里使用了栈进行数据的反转),在转化为int类型,再输出.这种方法的代码如下:
public static int reverse(int x) {
if (x == 0) {
return 0;
}
if (x > 0) {
Stack<Character> stack = new Stack<>();
String s = String.valueOf(x);
for (int i = 0; i < s.length(); i++) {
stack.push(s.charAt(i));
}
StringBuffer stringBuffer = new StringBuffer();
for (int i = 0; i < s.length(); i++) {
stringBuffer.append(stack.pop());
}
double v = Double.parseDouble(stringBuffer.toString());
if (v > Integer.MAX_VALUE) {
return 0; // 大于int范围输出0
} else {
return (int) v;
}
} else {
Stack<Character> stack = new Stack<>();
String s = String.valueOf((Long.valueOf(x) * -1));
for (int i = 0; i < s.length(); i++) {
stack.push(s.charAt(i));
}
StringBuffer stringBuffer = new StringBuffer();
for (int i = 0; i < s.length(); i++) {
stringBuffer.append(stack.pop());
}
double v = Double.parseDouble(stringBuffer.toString());
if (v > Integer.MAX_VALUE) {
return 0; // 大于int范围输出0
} else {
return (int) v * -1;
}
}
}
因为考虑到反转后的数据的长度可能超过了int类型,所以用在代码里面先把数据转化为double类型处理,再通过与Integer.MAX_VALUE 进行对比,如果大于则是溢出了,
按照题意返回0
(二) 第二种则是利用数学方法进行反转,因为整数在模以10可以得到他的末位数字,
在java中整数除以整数的结果只能是整数,小数部分被抛弃用这个特性可以挨个获取他的位数,然后对位数挨个乘以10,这样完成数字的反转,但是也要考虑数据的溢出
这里用了两种方法来处理数据的溢出,代码如下:
public static int reverse01(int x) {
int res = 0;
int last;
while (x != 0) {
int tem = x % 10;
last = res;
res = res * 10 + tem;
//当res / 10 != last成立时,说明此时res的数据范围已经超出int类型的范围了,该思路可能在C++里面运行报错
if (res / 10 != last) {
return 0;
}
x /= 10; 在java中整数除以整数的结果只能是整数,小数部分被抛弃
}
return res;
}
public static int reverse02(int x) {
double res = 0;
while (x != 0) {
int tem = x % 10;
res = res * 10 + tem;
if (res > Integer.MAX_VALUE || res < Integer.MIN_VALUE) {
return 0; // 大于int范围输出0
}
x /= 10;
}
return (int) res;
}
这两种方法的效率差不多,下面截图是我在leetcode里面跑的结果截图,中间那个是提交错的,由此可见这两种方法的效率几乎是一样的.最后总结一下,在使用int类型数据时,
一定要注意他是否会溢出,一般超过10亿的数据就用long存储