算法

算法面试题之反转整数

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更大的话,那肯定溢出了,反之则没有溢出。
    考虑到特殊的情况。
上一篇下一篇

猜你喜欢

热点阅读