整数反转
1.题目描述
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
2.思路
反转数字,首先需要获得每一位上的数字,对10取模即可,然后倒过来拼成一个新的数字。由于不清楚数据的长度,开一个32位的数组来存储它的每一位数字,肯定是足够。题中还要求做反转后的数字的越界判断,可使用Integer里面的最大值和最小值常量数据进行判断。时间复杂度为O(n).
3.解法
public int reverse(int x) {
int[] resultArray = new int[32];
int count = 0;
long result = 0;
while(true){
resultArray[count] = x%10;
count++;
x = x/10;
if(x==0)
break;
}
count--;
for(int i = 0;i <32;i++){
if(resultArray[i]!=0)
result +=resultArray[i]*Math.pow(10,count);
count--;
}
if(result<Integer.MIN_VALUE||result>Integer.MAX_VALUE)return 0;
return (int)result;
}
网上更为简洁的做法,一次循环即可。一边整体移位,一边往后遍历。最妙的是,用强制转换后的(int)n做对比,比我用Integer的最大最小值要简洁的多了。
public int reverse(int x) {
long n = 0;
while(x != 0) {
n = n*10 + x%10;
x = x/10;
}
return (int)n==n? (int)n:0;
}