题目就不说了 意思很简单
暴力解法也很简单
class Solution {
public int reverse(int x) {
//暴力解法 注意1 当数值超过2的32次方 数值会发生变化 这里进行一个判断解决
//注意2 -2147483648无法正常取绝对值 所以在每个值那进行一个判断
Stack<Integer> s1=new Stack<>();
Boolean flag=true;
int n;
int num=0;
if (x==0){
//System.out.println(num);
return 0;
}
if (x>0){
flag=true;
while (x!=0){
n=x%10;//取余 123%10=3
s1.push(n);
x=x/10;
}
}else {
x=Math.abs(x);
flag=false;
while (x!=0){
n=x%10;//取余 123%10=3
s1.push(n);
x=x/10;
}
}
//栈最顶层是个位数 底层位数高
int i=1;
while (s1.size()>0){
int tem=Math.abs(s1.pop());
if (i>=1000000000&&tem>=5){
return 0;
}
num=num+tem*i;
i=i*10;
}
if (num>(Math.pow(2,32)-1)||num<Math.pow(2,-32)){
return 0;
}
if (!flag){
num=-1*num;
}
return num;
}
}
惊呼大佬的
下面
int x=123;
//绝了 发现一个很巧妙的
int n=0;
while (x!=0){
n=n*10+x%10;
x=x/10;
}
return (n<(Math.pow(2,32)-1)||n>(Math.pow(2,-32)))?n:0;
说来惭愧 我开始的代码有两个while循环,然后我尝试将其修改为一个while循环,确实也可以改
但是这样的
if (x>0){ flag=true; while (x!=0){ n=x%10;//取余 123%10=3 n=Math.abs(n)*i;//无法知道最大位数 所以还是得有两个循环 if (i>=1000000000&&(n/i)>=5){ return; } num=num+n; i=i*10; x=x/10; } }
然鹅卡在这个位数个数上 我从1开始,但实际上是每次应该是从最高位的*10开始
然后就卡住了
但大佬的解法就很巧妙
每次取余之后 整体*10
惊呼啊