ARTS Week 3

Algorithm

本周的 LeetCode 題目為 8. 字元串轉換整數 (atoi)

題目簡介:請你來實現一個 myAtoi(string s) 函數,使其能將字元串轉換成一個 32 位有符號整數(類似 C/C++ 中的 atoi 函數)。具體的要求可訪問上面的鏈接查看。

題目思路:因為 int 可能會存在溢出,因此可以先用 long 變數儲存結果,而後再判斷有無溢出。字元串匹配規則如下:

  • (可選)開始是空格可以自動跳過
  • (可選)+/- 可以用來記錄是否為正負數
  • (必選)isDigit(ch) == true 就是數字
    需要注意的是:
  • (必然會錯) 接收到 +/- 號後,接下來必須得是數字,中間其他任何字元都是不合法的(包括空格)
  • (必然會錯)一旦開始接收數字後,接下來必須是數字,其他字元都是不合法的

最後需要判斷下結果是否超過了 int 的範圍,若超過則根據題目說明進行設置,反之直接返回結果即可。

最終程式碼

class Solution {
    public int myAtoi(String s) {
        long ans = 0;
        boolean isPositive = true;
        boolean isStart = false;
        int isOutOfRange = 0;
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) == '-') {
                if (isStart == false) {
                    isPositive = false;
                } else {
                    break;
                }
                isStart = true;
            } else if (s.charAt(i) == '+') {
                if (isStart == true) {
                    break;
                }
                isStart = true;
            } else if (Character.isDigit(s.charAt(i)) == true) {
                if (isStart == false) {
                    isStart = true;
                }
                ans = ans * 10 + Character.digit(s.charAt(i), 10);
                if ((isPositive == false) && (-ans <= Integer.MIN_VALUE)) {
                    isOutOfRange = -1;
                    break;
                } else if (ans > Integer.MAX_VALUE) {
                    isOutOfRange = 1;
                    break;
                }
                else {
                    continue;
                }
            } else {
                if ((isStart == false) && s.charAt(i) == ' ' ) {
                    continue;
                }
                break;
            }
        }
        switch (isOutOfRange) {
            case 1:
                return Integer.MAX_VALUE;
            case -1:
                return Integer.MIN_VALUE;
            default:
                if (isPositive == false) {
                    return (int) -ans;
                } else {
                    return (int) ans;
                }
        }
    }
}

除了常規解法外,本題目還可以通過 確定有限狀態機(deterministic finite automaton, DFA) 來進行解決,具體解法可以參考另一篇文章(目前未更新)

Review

本周 Review 的英文文章為:Social networks: It’s worse than you think

在這篇文章中,作者介紹說,資訊傳播也遵循一個冪律:如果一個資訊包含的字數少,它被分享的概率就會增加。這意味著,隨著網路中資訊數量的增加,那些傳播的資訊的品質就會下降。在我們的生活中,今天有越來越多的新聞和資訊可供我們閱讀,但我們獲取到的、傳播的資訊品質卻在下降。

事實上,我個人認為我們今天看到的所有資訊,明天就會忘記50%,一周後就會忘記80%以上。這就是少就是多,而多就是少。

Tip

每載入一個類,JVM 就會為其創造一個 Class 類型的實例,並將二者關聯起來。Class 實例在 JVM 中是唯一的,因此可以使用 Class 實例來判斷是否為同一個類型。同時,Java 中內置的關鍵字 instanceof 也可以用來判斷是否為同一個類型。那麼通過 Class 實例和 instanceof 關鍵字判斷有何不同呢?

  • instanceof:此關鍵字不僅可以匹配類型,還會匹配是否為類型的子類
  • Class:通過使用 == 來判斷兩個類型的 Class 是否相等,只可以精確的判斷數據類型,但並不能作子類型的比較

示例程式碼如下:

public class Main {
    public static void main(String[] args) {
        Integer n = new Integer(123);

        boolean b11 = n instanceof Integer; // true,因為n(Integer)是Integer類型
        boolean b12 = n instanceof Number; // true,因為n(Integer)是Number類型的子類
        boolean b13 = n instanceof Double // false,因為n(Integer)和Double類型無繼承關係

        boolean b3 = n.getClass() == Integer.class; // true,因為n.getClass()返回Integer.class
        boolean b4 = n.getClass() == Number.class; // false,因為Integer.class!=Number.class
    }
}

如果想要判斷兩個 Class 是否可以向上轉型,需要通過調用 isAssignableFrom()

// Integer 類是繼承自 Number 類
public class Main {
    public static void main(String[] args) {
        Integer.class.isAssignableFrom(Integer.class); // true,因為Integer可以賦值給Integer
        Number.class.isAssignableFrom(Integer.class); // true,因為Integer是Number的子類
        Object.class.isAssignableFrom(Integer.class); // true,因為所有類都是Object的子類
        Integer.class.isAssignableFrom(Number.class); // false,因為Integer是Number的子類,無法用父類給子類賦值。
    }
}

Share

學會善用日程表。日常生活中每天都有各種事需要去處理,有些事在特定時間才會開始。過去的自己經常使用大腦去記憶接下來幾天何時要做什麼事,但隨著年齡的增加和要處理的事情增加,自己的記憶力也沒有從前好了,不時地會忘記一些事,有時候需要別人提醒才會想起。但是這樣可能就會打亂了自己的時間安排,被動的被時間推著走。為了讓自己能不忘記事情,最近兩周在嘗試使用日程表,這樣就可以提前知道自己的哪些時間會被佔用,以及安排事情時也不會讓時間衝突,每天只需要看一眼當日的日程表後,在開始計劃今天的時間,增強了自己對時間的掌控力。經過使用後,發現利用日程表還有一個好處,可以釋放一部分腦容量空間,讓本不富裕的腦容量可以存放更多有用的資訊,至於何時要做什麼,還是留給電腦手機等設備去記憶吧 😃