一個頭發稀少、穿着格子襯衣的中年男子走了進來,把手里拿的MAC放在桌子上,對我說:“我會用電腦記錄面試過程,你不要介意啊”。
我回答到:“沒關系。”
面試官:“先來一點基礎的算法題吧,用Java寫一個方法,求100萬內的質數。”
我心中暗想確實很基礎,質數不就是除了1和自身外無法被其他數整除的數嘛,於是便寫下:
public static List<Integer> findPrime(){
List<Integer> list = new ArrayList<>(100000);
for (int n = 2; n < 1000000; n++) {
boolean isPrime = true;
for (int i = 2; i < n; i++) {
if (n % i == 0) {
isPrime = false;
break;
}
}
if (isPrime) {
list.add(n);
}
}
return list;
}
歡迎關注微信公眾號:萬貓學社,每周一分享Java技術干貨。
面試官皺了一下眉頭,說:“計算整除的時候,需要從2一直計算到n-1嘛?”
經過這么一提醒,我突然想起來整除計算到平方根就可以了,於是馬上修改了代碼:
public static List<Integer> findPrime(){
List<Integer> list = new ArrayList<>(100000);
for (int n = 2; n < 1000000; n++) {
boolean isPrime = true;
int sqrt = (int) Math.sqrt(n);
for (int i = 2; i <= sqrt; i++) {
if (n % i == 0) {
isPrime = false;
break;
}
}
if (isPrime) {
list.add(n);
}
}
return list;
}
歡迎關注微信公眾號:萬貓學社,每周一分享Java技術干貨。
面試官看了看,說:“寫的很好,功能基本上都實現了。不過再想想,有什么可以優化的地方?”
我想了想,說:“好像沒有什么可以優化的?”
我左思右想一番,說:“應該沒有吧。”
面試官說:“確定沒有了嘛?”
我肯定地回答:“確定沒有了。”
面試官:“好吧,這個問題先到這。”
我有點不服氣,搶着問到:“您說說,還有什么可以優化的地方?”
面試官微笑了一下,說:“還可以利用之前計算出質數做整除就可以了,性能至少可以提升一倍。”
面試官在我寫的代碼上改了幾筆,就變成了:
public static List<Integer> findPrime(){
List<Integer> list = new ArrayList<>(100000);
for (int n = 2; n < 1000000; n++) {
boolean isPrime = true;
int sqrt = (int) Math.sqrt(n);
for (Integer i : list) {
if (n % i == 0) {
isPrime = false;
break;
}
if (i > sqrt) {
break;
}
}
if (isPrime) {
list.add(n);
}
}
return list;
}
歡迎關注微信公眾號:萬貓學社,每周一分享Java技術干貨。
我茅塞頓開,這次面試真的是學到了。
本故事純屬虛構,如有雷同實屬巧合。
歡迎關注微信公眾號:萬貓學社,每周一分享Java技術干貨。