整数反転
トピックリンク:
https://leetcode-cn.com/problems/reverse-integer/
タイトル説明
32ビットの符号付き整数を指定すると、各整数の桁を反転する必要があります。
注:環境が32ビットの符号付き整数のみを格納できると仮定すると、値の範囲は[-2 ^ 31、2 ^ 31 −1]です。この仮定によれば、反転後に整数がオーバーフローすると、0が返されます。
例:
例1:
入力:123
出力:321
例2:
入力:-123
出力:-321
例3:
入力:120
出力:21
詳細なトピック
この質問では、符号付き整数を反転する必要があります。つまり、反転後、数値64は46になり、1桁は10桁に反転され、10桁は1桁に反転されます。指定された整数が負の場合、整数の符号は変更できません。この質問では、次の点に注意する必要があります。
- 整数は負の数になります。
- 質問に必要な符号付き整数は32ビット整数です(32ビット整数の値の範囲:-2147483648〜2147483647、この範囲を超えるとオーバーフローになります)。整数が反転された後にオーバーフローが発生した場合は、0を返す必要があります。
- 最後のビットが0の場合は破棄する必要があります。たとえば、120を反転すると、21になります。
問題解決計画
アイデア1:時間の複雑さ:O(lgx)空間の複雑さ:O(1)
数字を反転するときに注意が必要なのはオーバーフローの問題ですが、なぜオーバーフローの問題があるのですか?
値の範囲当社のint型がある-2147483648〜2147483647(-2 ^ 31〜2 ^ 31-1)私たちが反転したい場合は、その後の範囲内の数十億三を、我々が得る3000000001のが、フリップの後に番号が範囲を超えています、この状況はオーバーフローです。この時点で、プログラムは0を返します。
入力が負の数の場合、元の関数が再帰的に呼び出され、パラメーターは-xになります。コードのおおよその実行フローは次のとおりです。
- 最初にxが負の数であるかどうかを判断し、負の数である場合は、最初に絶対値を取り、次に再帰的に反転し、最後に結果を負の数に変換します。
- resは最終結果であり、最初は0に等しくなります。x%10(例:123%10 = 3)最後の桁を取ります。毎回最後の桁を取得し、それを結果の現在の最高桁として使用します。
- 結果resがオーバーフローしているかどうかを判別し、オーバーフローした場合は0を返します。
詳細なコードは次のとおりです。
public class Solution {
/**
* 时间复杂度: O(lgx) 空间复杂度: O(1)
* @param x 目标值
* @return int
*/
public static int reverse(int x) {
if (x == -2147483648) {
//如果不做这个判断,下面的x=-x将会报错
return 0;
}
if (x < 0) {
// 判断是否为负数
return -reverse(-x); // 如果是负数则取绝对值调用自身,最后将结果转为负数
}
int res = 0;
while (x != 0) {
// 每次得到最后一位数字,并将其作为结果中的当前最高位
if (res > 214748364) {
// 处理溢出
return 0;
}
res = res * 10 + x % 10;
x /= 10;
}
return res <= Integer.MAX_VALUE ? res : 0; // 如果溢出就返回0
}
}