【LeetCode Easy】007 Reverse Integer

Easy 007 Reverse Integer

Description:

Given a 32-bit signed integer, reverse digits of an integer.
Assume we are dealing with an environment which could only store integers within the 32-bit signed integer range: [−2^31,  2^31 − 1]. For the purpose of this problem, assume that your function returns 0 when the reversed integer overflows.
==Example==
123→321 -123→-321 120→21

My Solution:

  1. 第一時間想到這是經典的取模取餘運算,可是寫的過程當中遇到了不少問題QAQ(這麼簡單一題git

    • 基礎作法:取一個整數的最後一位數字只要把這個整數 % 10就能夠,要取除最後一位數字以外的其它數字只要 / 10
    • int是沒有長度函數的,須要轉化成String才能使用長度函數
    • 用這個方法最大的難點在於用int類型時處理溢出問題,本來沒有溢出的數字在進行翻轉時頗有可能溢出,最合適的方法是在處理過程當中進行預判函數

      • 假設翻轉過程的中間值用res來保存,每次取下來的那個數字用pop來保存,overflow = 2147483646,underFlow = -2147483647
      • 已知當res * 10 + pop 會引發溢出時,res一定是 ≥ (max / 10)或 ≤ (min / 10)的,其中相等時對pop有要求
      • 根據上述條件在翻轉時進行溢出預判
    • Java代碼:this

      public static int reverse(int x) {
            int overFlow = (int)Math.pow(2,31) -1;     //overFlow = 2147483646
            int underFlow = 0 - (int)Math.pow(2,31);   //underFlow = -2147483647
            int pop = 0;
            int result = 0;
      
            while(x != 0){
                pop = x % 10;
                if((result>overFlow/10) || (result==overFlow/10 && pop>7))
                    return 0;
                if((result<underFlow/10) || (result==underFlow/10 && pop<-8))
                    return 0;
                result = result * 10 + pop;   //★
                x = x/10;
            }
      
            return result;
        }

Fast Solution:

  1. 題目中要求的溢出條件實際上是針對int型數據的,這題用Java來寫的話其實能夠用long類型code

    • Java代碼:ip

      public int reverse(int x) {
           long res = 0;   //此處用了long
           while (x != 0) {
               res = res * 10 + x % 10;
               x = x / 10;
           }
           return (int)res == res ? (int)res : 0;   
       }
相關文章
相關標籤/搜索