算法面试题之反转整数
2018-08-26 本文已影响98人
码上就说
题目:
给定一个32位有符号的整数,将整数中的数字进行反转。
例如:
输入:123
输出:321
输入:-123
输出:-321
当前输入的整数范围为:[-2^31, 2^31 - 1],如果反转之后的整数超过这个范围,直接返回0
import java.util.Scanner;
public class TestReverseNumber {
public static void main(String[] args) {
TestReverseNumber instance = new TestReverseNumber();
Scanner sc = new Scanner(System.in);
int x = 0;
while((x = sc.nextInt()) != 0) {
int result = instance.reverse(x);
System.out.println("result = " + result);
}
}
public int reverse(int x) {
int result = 0;
if (x >= 0) {
result = reverseInner(x, true);
} else {
if (x == Integer.MIN_VALUE) {
return -1;
}
result = 0 - reverseInner(Math.abs(x), false);
}
return result;
}
public int reverseInner(int x, boolean symbol) {
return reverseInner(String.valueOf(x), symbol);
}
public int reverseInner(String src, boolean symbol) {
StringBuilder sb = new StringBuilder();
int length = src.length();
String maxValue = String.valueOf(Integer.MAX_VALUE);
if (length == maxValue.length() && symbol) {
for (int index = length -1; index >= 0; index--) {
if ((int)src.charAt(index) > (int)maxValue.charAt(length-index-1)) {
return 0;
} else {
continue;
}
}
}
for(int index = length - 1; index >= 0; index--)
sb.append(src.charAt(index));
return Integer.valueOf(sb.toString()).intValue();
}
}
下面仔细分析一下本题的思路,注意几个要点:
- 输入的范围必须是[-2^31, 2^31 - 1]
- 反转之后如果超出这个范围,直接返回0
- 本次的翻转与符号无关:
就是说输入-123,输出是-321,也就是说可以将负数先看成正数,反转正数,之后加上符号。但是也要注意特殊情况,例如-2^31,去掉负号直接溢出了,这个个例要特别处理下。
本题显然要考察的是特殊情况下如何避免溢出的情况。我们直接假设当前没有溢出,反转之后的数为result
- 如果result > Integer.MAX_VALUE,那么肯定溢出了。
这时候将result转化成字符串,分别和Integer.MAX_VALUE的字符串逐位比较,如果相对应的位result更大的话,那肯定溢出了,反之则没有溢出。
考虑到特殊的情况。