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