- 小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
题目介绍
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
示例 1:
输入:x = 123 输出:321 示例 2:
输入:x = -123 输出:-321 示例 3:
输入:x = 120 输出:21 示例 4:
输入:x = 0 输出:0
提示:
-231 <= x <= 231 - 1
解题
会导致溢出,需要考虑到异常情况
1.将数字转换成string,然后进行循环拼接和转换等操作.使用%10和/10一步步取出最后一位的数字
public static int reverse(int x) {
// 转换成string
String s = String.valueOf(x);
String i = "";
// 通过string的拼接实现数字拼接
while (x != 0) {
// 获取个位数
i = i + String.valueOf(x % 10);
// x去掉个位数
x = x / 10;
}
String name = "";
// 循环会将-也带入,使用 - 当做分隔符将数字分离成数组
String[] split = i.split("-");
for(String value : split) {
name = name + value;
}
//当入参为0时,返回0 (上面的逻辑判断为"")
if (name.length()==0) {
name = "0";
}
// 分离成数组那一部将入参的正负抹掉了,现在手动判断加入
if (s.contains("-")) {
name = "-" + name;
}
// 可能会发生溢出问题,手动返回
try {
return Integer.valueOf(name);
} catch (Exception e) {
return 0;
}
}
2.入参转换成字符串,在通过StringBuild翻转成字符串转换成int
String s = String.valueOf(x);
// 直接使用字符串翻转
StringBuilder stringBuilder = new StringBuilder(s);
// 字符串转换成stringBuild进行翻转然后再转换成字符串
try{
// 如果是负数,需要将负数去掉再翻转
if (s.startsWith("-")) {
return Integer.valueOf("-"+new StringBuilder(s.substring(1)).reverse().toString());
}else {
return Integer.valueOf(new StringBuilder(s).reverse().toString());
}
}catch (Exception e){
return 0;
}
3.方法2的改进
将判断正负提出try提高性能,并且改成小于,通过flag进行符号控制
String s = String.valueOf(x);
// 直接使用字符串翻转
String value = s;
// 负数标志位,如果去掉负数,那么该值需要替代负数(翻转的数 乘 -1)
int flag = 1;
// 如果是负数,需要将负数去掉
if (x < 0) {
flag = -1;
value = s.substring(1);
}
// 切换成StringBuild翻转再返回
try{
return Integer.valueOf(new StringBuilder(value).reverse().toString()) * flag;
}catch (Exception e){
return 0;
}
4.直接用int转换,进行出参的判断
但是!!! 这个判断毫无意义,int 保存的时候已经强转了,因此不会触发溢出.
因此,需要在循环里 /10 溢出的时候就返回 0
int reverse = 0;
while (x != 0) {
// 通过*10,可以每次向前一位,刚好填补
reverse = reverse * 10 + x % 10;
x = x /10;
}
// 由于翻转,因此可能会溢出 1999xxx 翻转成9xxxx1
return x > -2147483648 && x < 2147483647 ? reverse : 0;
通过一个中间值记录上一个值,通过/10 比较,如果不相同,那么说明溢出
int reverse = 0;
while (x != 0) {
//记录上一个翻转值
int temp = reverse;
// 通过*10,可以每次向前一位,刚好填补
reverse = reverse * 10 + x % 10;
x = x / 10;
// 和上一个值进行比较,如果/10之后 int不相等,那么说明溢出.
if (reverse / 10 != temp) {
return 0;
}
}
// 由于翻转,因此可能会溢出 1999xxx 翻转成9xxxx1
return reverse;