007-整数の反転
32ビットの符号付き整数を指定し、整数の数値を反転します.
入力:123
出力:321
入力:-123
出力:-321
入力: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)同理可知負数の処理方法;
実装コード:
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;
}
};