题目
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
普遍的思路,新建一个数组反过来存,简单除暴,但是效率和内存消耗大
class Solution {
public int reverse(int x) {
if(x == 0 || x<-2147483648 || x>2147483647){
return 0;
}
char[] str = Integer.toString(x).toCharArray();
char[] newStr;
if(x < 0){
newStr = new char[str.length];
newStr[0] = '-';
for(int i = 1;i < str.length ;i++){
newStr[i] = str[str.length - i];
}
}else{
if(str[str.length-1] == '0'){
newStr = new char[str.length - 1];
for(int i = 0;i < str.length-1 ;i++){
newStr[i] = str[str.length - i - 2];
}
}else{
newStr = new char[str.length];
for(int i = 0;i < str.length ;i++){
newStr[i] = str[str.length - i - 1];
}
}
}
Long y = Long.parseLong(String.valueOf(newStr));
if( y<-2147483648 || y>2147483647){
return 0;
}
return Integer.parseInt(Long.toString(y));
}
}
结果![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/d6406d822f8743c79433ffc67a7aee77.png)
结果可以看出,虽然解决了问题但是效率并不客观。
经过研究和思考,下面的方法更好,我们要考虑一下怎么取最后一个数字
例如:12345 怎么取5 ==> 1234怎么取4 ==> 123 怎么取3
由图可见:我们取模就可以了,可以看出代码简洁了很多。
class Solution {
public int reverse(int x) {
//方法二
int res = 0;
while(x!=0) {
//每次取末尾数字
int tmp = x%10;
if (res>214748364 || res<-214748364) {
return 0;
}
res = res*10 + tmp;
x /= 10;
}
return res;
}
}
具体的执行逻辑:
x=12345
第一次:tmp = 5 res = 5 x = 1234
第二次:tmp = 4 res = 54 x = 123
第三次:tmp = 3 res = 543 x = 12
第四次:tmp = 2 res = 5432 x = 1
第五次:tmp = 1 res = 54321 x = 0
运行结果
结果的确让人很满意