算法9 leetcode7. Reverse Integer 整数反转
这个题因为java的指数运算搞错了卡了很久。。无语。。
a^b
是java的异或位运算,指数运算是Math.pow(a,b)
位异或:第一个操作数的的第n位于第二个操作数的第n位 相反,那么结果的第n为也为1,否则为0
题目
给你一个 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
提示:
-2^31 <= x <= 2^31 - 1
思路
1开始我想把整数转换成数组,然后从最后一位向前取,添加到新数组中,然后把新数组转换回来。
2但是换来换去太麻烦了,想到最后一位就是取10的余数,然后每次取完踢掉最后一位;最后把判断条件加上就行了
3利用对数来判断数字长度、÷10取整剃末位、末位在乘相应位数累加就可以得到翻转的数了(判断超出32位在累加过程中就可以判断)
代码
我的
class Solution {
public int reverse(int x) {
int k=0;
int tm=x;
int m=0;
double log=Math.ceil(Math.log10(x));//几位数
if(x<0){
x=-x;
log=Math.ceil(Math.log10(x));//几位数
for(int i=1;i<=log;i++){
m=x%(10);//取末位
x=(int)Math.floor(x/10);//踢末位
if (k>=2147483647) {//判断超出32位
k=0;
break;
}
else k+=m*Math.pow(10,((int)(log-i)));
}
}
else{
for(int i=1;i<=log;i++) {
m=x%(10);//取末位
x=(int)Math.floor(x/10);//踢末位
if (k>=2147483647) {
k=0;
break;
}
else k+=m*Math.pow(10,((int)(log-i)));
}
}
if(x==1) k=1;//对数特殊
if (tm<0) k=-k;//添加负号
return k;
}
}
热评的
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xnx13t/?discussion=ukHfZx
public int reverse(int x) {
int res = 0;
while (x != 0) {
int t = x % 10;
int newRes = res * 10 + t;
//如果数字溢出,直接返回0
if ((newRes - t) / 10 != res)
return 0;
res = newRes;
x = x / 10;
}
return res;
}