1. 程式人生 > 其它 >ARTS Week 6

ARTS Week 6

Algorithm

本週的 LeetCode 題目為 7. 整數反轉

題目簡介:給你一個 32 位的有符號整數 x ,返回將 x 中的數字部分反轉後的結果。如果反轉後整數超過 32 位的有符號整數的範圍 [\(−2^{31}\), \(2^{31} − 1\)] ,就返回 0。假設環境不允許儲存 64 位整數(有符號或無符號)。假設環境不允許儲存 64 位整數(有符號或無符號)。例如:x=123 時返回 321,x=-1230 時返回 -321。

題目思路:題目關鍵要解決的地方在於需要判斷反轉後的數字是否溢位,但不能使用 64 位整數來處理。可以使用字串來儲存整數,通過比較字串的大小來判斷是否溢位。例如2147483647 是 int 的最大值,因為 "2147483648" > "2147483647"

因此可以判斷出 2147483648 會出現溢位。同時可以先判斷長度,因為比最大值短的數字(字串)必然不會出現溢位。

最終程式碼

class Solution {
    public int reverse(int x) {
        if (x == 0) {
            return 0;
        }
        /**
         * 因為程式碼中存在 `x = -x`,
         * 而最小值為 `-2147483648`,最大值為 `2147483647`,
         * 最小值在進行 `x = -x` 會發生溢位,因此需要單獨處理。
         */
        if (x == -2147483648) {
            return 0;
        }
        ArrayList<Integer> numberArr =  new ArrayList<>();
        int sign = 1;
        if (x < 0) {
            x = -x;
            sign = -1;
        }
        while (x != 0) {
            numberArr.add(x % 10);
            x = x / 10;
        }
        StringBuilder sb = new StringBuilder();
        if (sign == -1) {
            sb.append('-');
        }
        for (int number : numberArr) {
            sb.append(number);
        }
        String numStr = sb.toString();
        String maxIntStr = Integer.toString(Integer.MAX_VALUE);
        String minIntStr = Integer.toString(Integer.MIN_VALUE);
        if ((sign == 1) && (numStr.length() == maxIntStr.length()) && (numStr.compareTo(maxIntStr) > 0)) {
            return 0;
        } else if ((sign == -1) && (numStr.length() == minIntStr.length()) && (numStr.compareTo(minIntStr) > 0)) {
            return 0;
        } else {
            return Integer.parseInt(numStr);
        }
    }
}

Review

本週 Review 的英文文章為:軟體工程中的“最佳實踐”只是開發人員的個人偏好嗎?

作者開篇先提到從事軟體開發並不需要認證,不像醫生、律師需要獲取相應的執照才可以從業。那麼軟體開發的中的“最佳實踐”是否也並不存在,而是“高階”工程師所想要的。接著作者以自己為例,在 Spring Boot REST API 中每一個服務類都被定義成一個介面,但這些類並不沒有被繼承,作者認為這樣做是冗餘的。再比如版本控制,什麼時候使用 stash,什麼時候 rebase 等等,這樣的問題很難回答什麼是最好的選擇。

最後,作者認為程式設計的了去在於有眾多的工具可以幫助實現同一個目標,日常中對技術棧和編碼習慣的爭論中,99%並不會影響最終結果。

Tip

Java 中判斷字串是否相等應該使用 str1.equals(str2),而不使用 str1 == str2,因為 str1 == str2 判斷的是 str1str2 兩個字串所指向的物件是否相同,而我們一般想判斷相等是指它們的值是否相等,而不太關心是否是同一個物件。示例程式碼如下:

public class Main {
    public static void main(String[] args) {
        String str1 = new String("Hello");
        String str2 = new String("Hello");
        System.out.println(str1 == str2); // false
        System.out.println(str1.equals(str2)); // true
    }
}

Share

已經成功寫了一個月的 ARTS,感覺有一些提高,但覺得自己的書面表達能力還有待提高,有時候為了表達自己的意思,但會很羅嗦,這是未來需要改進的。