整数反転LeetCode07

整数反転


トピックリンク:

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になります。コードのおおよその実行フローは次のとおりです。

  1. 最初にxが負の数であるかどうかを判断し、負の数である場合は、最初に絶対値を取り、次に再帰的に反転し、最後に結果を負の数に変換します。
  2. resは最終結果であり、最初は0に等しくなります。x%10(例:123%10 = 3)最後の桁を取ります。毎回最後の桁を取得し、それを結果の現在の最高桁として使用します。
  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
    }
}

おすすめ

転載: blog.csdn.net/weixin_38478780/article/details/108419439