畫解算法:7. 整數反轉

題目連接

leetcode-cn.com/problems/re…java

題目描述

給出一個 32 位的有符號整數,你須要將這個整數中每位上的數字進行反轉。算法

示例 1:bash

輸入: 123
輸出: 321
複製代碼

示例 2:函數

輸入: -123
輸出: -321
複製代碼

示例 3:spa

輸入: 120
輸出: 21
複製代碼

注意:3d

假設咱們的環境只能存儲得下 32 位的有符號整數,則其數值範圍爲 [−231, 231 − 1]。請根據這個假設,若是反轉後整數溢出那麼就返回 0code

解題方案

思路

  • 標籤:數學
  • 本題若是不考慮溢出問題,是很是簡單的。解決溢出問題有兩個思路,第一個思路是經過字符串轉換加try catch的方式來解決,第二個思路就是經過數學計算來解決。
  • 因爲字符串轉換的效率較低且使用較多庫函數,因此解題方案不考慮該方法,而是經過數學計算來解決。
  • 經過循環將數字x的每一位拆開,在計算新值時每一步都判斷是否溢出。
  • 溢出條件有兩個,一個是大於整數最大值MAX_VALUE,另外一個是小於整數最小值MIN_VALUE,設當前計算結果爲ans,下一位爲pop
  • ans * 10 + pop > MAX_VALUE這個溢出條件來看
    • 當出現 ans > MAX_VALUE / 10還有pop須要添加 時,則必定溢出
    • 當出現 ans == MAX_VALUE / 10pop > 7 時,則必定溢出,72^31 - 1的個位數
  • ans * 10 + pop < MIN_VALUE這個溢出條件來看
    • 當出現 ans < MIN_VALUE / 10還有pop須要添加 時,則必定溢出
    • 當出現 ans == MAX_VALUE / 10pop < -8 時,則必定溢出,8-2^31的個位數

代碼

class Solution {
    public int reverse(int x) {
        int ans = 0;
        while (x != 0) {
            int pop = x % 10;
            if (ans > Integer.MAX_VALUE / 10 || (ans == Integer.MAX_VALUE / 10 && pop > 7)) 
                return 0;
            if (ans < Integer.MIN_VALUE / 10 || (ans == Integer.MIN_VALUE / 10 && pop < -8)) 
                return 0;
            ans = ans * 10 + pop;
            x /= 10;
        }
        return ans;
    }
}
複製代碼

畫解

fr<x>ame_00001.png
fr<x>ame_00002.png
fr<x>ame_00003.png
fr<x>ame_00004.png

後臺回覆「算法」,加入每天算法羣 以爲算法直擊靈魂,歡迎點擊在看轉發cdn

相關文章
相關標籤/搜索