给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
两个思路,第一个使用余数,第二个使用字符串:
方法一:
public int reverse(int x) {
int result = 0;
while(x!=0){
int tmp = x%10;
x/=10;
//这个判断要加在相加运算之前
if(result>Integer.MAX_VALUE/10||(result==Integer.MAX_VALUE/10&&tmp>7))return 0;
if(result<Integer.MIN_VALUE/10||(result==Integer.MIN_VALUE/10&&tmp<-8))return 0;
result=result*10+tmp;
}
return result;
方法二:
/*
* 字符串写法:
* 首先要知道三种数字转字符串的写法:
* 1.String s = ""+x;
* 2.String s = Integer.toString(x);
* 3.String s = String.valueOf(x);
* 以及字符串转整数的写法:
* 1.int x = Integer.parsenInt(s);
* 2.int x = Integer.valueOf(s).intValue();
* 一个字符串转为某个包装类型,其包装类型必有一个方法parseXXX(str);
* 其次是字符串反转:
* String的子类两个:StringBuilder和StringBuffer
* 知识复习:
* StringBuilder是常用的:速度快,但是线程不安全
* StringBuffer使用于线程安全,速度较慢。
* 两者都有一个方法为reverse,该方法能够实现字符串的反转
* 可以使用toString方法来实现两者与String的转换
* 关于符号问题:
* 方法一:在运算之前判断符号,去符号,做标记
* 方法二:
*
* 关于判断是否溢出问题:
* 在反转完成之后,字符串转为Long类型以保证其不会溢出,
* 之后在比较反转的数字是否已经超过int所承受的范围
*/
public static int reverse(int x) {
//首先解决符号问题:
//一个boolean类型作为是否为负的判断依据,默认值为false
//将x变为Long类型以防溢出
long lx = x;
boolean isFu = false;
if(lx<0){
isFu = true;
lx = -lx;
}
//第二步:数字转字符串:
StringBuilder str = new StringBuilder();
str.append(lx);
str.reverse();
//第三步:字符串转数字
Long l = Long.parseLong(str.toString());
//第四步:判断是否溢出,Long类型和Integer类型比较时Integer类型自动提升
if(l>Integer.MAX_VALUE||l<=Integer.MIN_VALUE){//溢出
return 0;
}
int res = l.intValue();
if(isFu){
return -res;
}else{
return res;
}
}
以上做记录。