简单系列第二题–7整数反转,题目如图所示。
看到题目的第一反应是采用模运算拿到每一位的数字,之后利用栈实现后进先出,每次出栈乘以相应的阶数即可。使用Java实现,栈的实现采用Deque效率高些。根据注意发现这题需要注意越界的问题,为防止越界采用了long进行存储。代码如下:
class Solution {
public int reverse(int x) {
boolean isPositiveNumber=true;
long tempX=0;
tempX=x;
if(tempX<0)
{
isPositiveNumber=false;
tempX=-tempX;
}
long result=0l;
long max=1;
long min=-1;
for(int i=1;i<=31;i++)
min=2*min;
max=-min-1;
Deque<Long> num=new ArrayDeque<>();
while(tempX>=10)
{
num.addFirst(tempX%10);
tempX=tempX/10;
}
num.addFirst(tempX);
// System.out.println("queue"+num);
int length=num.size();
int e=0;
long temp=0l;
while(!num.isEmpty())
{
temp=num.pollFirst();
for(int i=0;i<e;i++)
{
temp=temp*10;
}
result=result+temp;
e++;
}
if(isPositiveNumber)
{
if (result>max)
return 0;
else
return (int)result;
}else
{
if (-result<min)
return 0;
else
return (int)-result;
}
}
}
代码写得有些啰嗦了,由于不知道最大值和最小值的常量表示法,所以在开头的时候我自己计算了下(32位最大值Integer.MAX_VALUE,最小值Integer.MIN_VALUE,但是使用常量后时间反而更多了。。。),之后利用Deque存储通过取模运算得到的诸位值。利用pollFirst实现后进先出,之后每一位乘自己的阶数即可,这个数据采用long存储以防越界导致数据出错。最后判断范围,越界为0,不越界正常输出。
以上是我的思路,感觉实在没有发挥出java的力量。。。看了其他人的代码恍然大悟。
public int reverse(int x) {
int flag=x<0?-1:1;
int num=Math.abs(x);
StringBuilder newNum=new StringBuilder();
newNum.append(num);
newNum.reverse();
try {
int result = Integer.parseInt(newNum.toString());
return flag*result;
}
catch (NumberFormatException e){}
return 0;
}
这位仁兄通过字符串的操作方法巧妙地实现了顺序转换,之后通过Integer的parseInt方法实现转换为32位数字,如果转换出现NumberFormatException则证明越界。
官方的解决方案并没有使用高级的java数据结构或者封装好的方法,采用了纯数学的方法,采用了随着取模运算的进行随时判断是否越界的方法。然而通过实践,发现我的最初方法还是可以的。。。。
其中40的是最初的方法, 60采用了常量表示最大数和最小数,46采用了字符串的方法,41是官方的数学解法,这个时间也和当时的网络情况以及服务器程序的情况有关系总体来说时间复杂度都在O(Log10n)。
反思:其实自己被栈的思想绕迷糊了,比如123,进入队列是 [1,2,3],我采用的是1+20+300的方式,其实可以采用3先出队列,之后2出队列,30+2=32,之后1出队列320+1=321使用一个正常的先进先出即可。。。。。