007-整数の反転

2535 ワード

32ビットの符号付き整数を指定し、整数の数値を反転します.
   1:

入力:123
出力:321
   2:

入力:-123
出力:-321
   3:

入力:120
出力:21
注意:
我々の環境では32ビットの符号付き整数しか記憶できないと仮定し,その数値範囲は[−231,231−1]である.この仮定によれば,反転後の整数がオーバーフローすると0を返す.
解:
整数Xを反転させるには、「スタック空間」と見なせばよい.
まず「pop」整数の後ろの部分を「push」の別のスタック空間にします.
popセクション:
pop = X % 10; x/= 10;
Pushセクション:
push = ret * 10 + pop;
注意:ここでは整数のオーバーフロー問題を防止します.
解決策:pushの前に、数学の方法を運用します.
1)push>INT_の場合MAX/10では必ずオーバーフローが発生します.
2)push==INT_の場合MAX/10でpopが7より大きく、同様にオーバーフローする.
3)同理可知負数の処理方法;
実装コード:
class Solution {
public:
    int reverse(int x) {
        int pop = 0;
        int push = 0;
        while(x) {
            pop = x % 10;
            x /= 10;

            if(push > INT_MAX/10 || (push == INT_MAX/10 && pop > 7)) {
                return 0;
            }
            if(push < INT_MIN/10 || (push == INT_MIN/10 && pop < -6)) {
                return 0;
            }
            push = push * 10 + pop;
        }
        return push;
    }
};