面試真題:求100萬內的質數

一個頭發稀少、穿着格子襯衣的中年男子走了進來,把手裏拿的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;
}

面試官皺了一下眉頭,說:“計算整除的時候,需要從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;
}

面試官看了看,說:“寫的很好,功能基本上都實現了。不過再想想,有什麼可以優化的地方?”

我想了想,說:“好像沒有什麼可以優化的?”

我左思右想一番,說:“應該沒有吧。”

面試官說:“確定沒有了嘛?”

我肯定地回答:“確定沒有了。”

面試官:“好吧,這個問題先到這。”

我有點不服氣,搶着問到:“您說說,還有什麼可以優化的地方?”

面試官微笑了一下,說:“還可以利用之前計算出質數做整除就可以了,性能至少可以提升一倍。”

面試官在我寫的代碼上改了幾筆,就變成了:

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;
}

我茅塞頓開,這次面試真的是學到了。

本故事純屬虛構,如有雷同實屬巧合。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章