溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java如何實現整數反轉

發布時間:2022-01-17 11:41:57 來源:億速云 閱讀:336 作者:小新 欄目:大數據
# Java如何實現整數反轉

## 引言

在編程面試和日常開發中,整數反轉是一個經典問題。給定一個32位有符號整數,我們需要將這個整數中的數字順序反轉。如果反轉后的整數溢出32位有符號整數的范圍(即[-231, 231 - 1]),則返回0。本文將詳細介紹在Java中實現整數反轉的幾種方法,并分析它們的優缺點。

## 問題描述

給定一個32位有符號整數`x`,返回其數字部分反轉后的結果。如果反轉后的整數超過32位有符號整數的范圍,則返回0。假設環境不允許存儲64位整數(即`long`類型)。

**示例1:**

輸入:x = 123 輸出:321


**示例2:**

輸入:x = -123 輸出:-321


**示例3:**

輸入:x = 120 輸出:21


## 方法一:數學方法

### 思路分析
通過數學運算逐步反轉整數:
1. 初始化`reversed`為0。
2. 循環處理`x`的每一位:
   - 取`x`的最后一位數字(`x % 10`)。
   - 將`reversed`乘以10并加上取出的數字。
   - 將`x`除以10(`x /= 10`)。
3. 在每次迭代中檢查`reversed`是否會溢出。
4. 返回最終結果。

### 代碼實現
```java
public int reverse(int x) {
    int reversed = 0;
    while (x != 0) {
        int digit = x % 10;
        // 檢查溢出
        if (reversed > Integer.MAX_VALUE / 10 || 
            (reversed == Integer.MAX_VALUE / 10 && digit > 7)) {
            return 0;
        }
        if (reversed < Integer.MIN_VALUE / 10 || 
            (reversed == Integer.MIN_VALUE / 10 && digit < -8)) {
            return 0;
        }
        reversed = reversed * 10 + digit;
        x /= 10;
    }
    return reversed;
}

復雜度分析

  • 時間復雜度:O(log??x),因為循環次數與x的位數成正比。
  • 空間復雜度:O(1),只使用了常數空間。

方法二:字符串反轉

思路分析

將整數轉換為字符串,反轉字符串后再轉換回整數: 1. 處理符號(負數)。 2. 反轉字符串。 3. 轉換回整數并檢查溢出。 4. 恢復符號。

代碼實現

public int reverse(int x) {
    String str = Integer.toString(x);
    boolean isNegative = str.charAt(0) == '-';
    if (isNegative) {
        str = str.substring(1);
    }
    String reversedStr = new StringBuilder(str).reverse().toString();
    try {
        int reversed = Integer.parseInt(reversedStr);
        return isNegative ? -reversed : reversed;
    } catch (NumberFormatException e) {
        return 0;
    }
}

復雜度分析

  • 時間復雜度:O(log??x),字符串操作的時間與位數成正比。
  • 空間復雜度:O(log??x),需要額外的字符串存儲空間。

方法三:使用long類型(假設允許)

思路分析

利用long類型暫存反轉結果以避免溢出: 1. 使用long存儲中間結果。 2. 反轉后檢查是否在int范圍內。 3. 返回結果或0。

代碼實現

public int reverse(int x) {
    long reversed = 0;
    while (x != 0) {
        reversed = reversed * 10 + x % 10;
        x /= 10;
    }
    if (reversed > Integer.MAX_VALUE || reversed < Integer.MIN_VALUE) {
        return 0;
    }
    return (int) reversed;
}

復雜度分析

  • 時間復雜度:O(log??x)。
  • 空間復雜度:O(1)。

方法對比

方法 優點 缺點
數學方法 高效,空間最優 需要手動處理溢出
字符串反轉 代碼簡潔,易讀 性能較低,空間占用較大
使用long 簡單直觀,避免復雜判斷 可能違反題目限制

邊界條件測試

以下是一些需要特別注意的測試用例: 1. 正常情況: - 123 → 321 - -123 → -321 2. 溢出情況: - 2147483647 → 0(反轉后溢出) - -2147483648 → 0(反轉后溢出) 3. 末尾為0: - 120 → 21 4. 單個數字: - 5 → 5

總結

在Java中實現整數反轉有多種方法,選擇哪種方法取決于具體需求和限制: - 推薦方法:數學方法(方法一),因其高效且符合題目要求。 - 備選方法:如果允許使用long,方法三更簡潔。 - 避免方法:字符串反轉(方法二)在性能敏感場景不推薦。

通過本文的學習,讀者應能掌握整數反轉的核心思路,并靈活應對面試或開發中的類似問題。

擴展思考

  1. 如何反轉64位整數(long類型)?
  2. 如果輸入是字符串形式的大整數(超出long范圍),如何反轉?

”`


:實際字數約為1200字,可通過擴展“邊界條件測試”或“擴展思考”部分補充至1350字。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女