面試官:來寫個程式碼求一下兩個數的最大公約數吧

超悅人生發表於2020-09-04

最近去面試了,面了幾家公司,深刻認識到一個道理,越是基礎的問題越重要,越能考察一個人的技術功底與邏輯思維。比如我們接下來要說的求兩個數的最大公約數的問題。這類簡單的演算法題目一般會出現在面試環節,面試官要求你當場手撕的那種。

言歸正傳,首先我們要知道面試官出求兩個數的最大公約數這個題目的目的是什麼。知己知彼,才能百戰不殆嘛。這個問題首先考察的是候選人的數學功底,就是看你知不知道一些求公約數的演算法,比如輾轉相除法、更相減損法等;其次就是考察你的程式碼能力了,看你能不能把演算法用程式碼寫出來,寫的程式碼有沒有bug,注沒注意邊界的處理等等。下面我們分別來看一下,不同的候選人會有什麼樣的表現。

第一種,數學功底不紮實的,不知道目前已有的求公約數的方法,那估計只能寫出下面這種程式碼了。

//暴力求解
   private static int getCommonDivisor(int m,int n){
        //非法引數的處理
        if(m <= 0 || n <= 0){
            return -1;
        }
        int min = Math.min(m,n);
        int res = 1;
        for(int i = 1;i <= min;i ++){
            if(m % i == 0 && n % i == 0){
                res = i;
            }
        }
        return res;
   }

這種就是暴力求解,不做過多解釋了。面試官顯然不會滿意這種程式碼。

第二種,知道一些求公約數的演算法,但是無法用程式碼實現,這種屬於程式碼功力不夠的,估計只能回家等通知了。

第三種,知道求公約數的演算法,並且能寫出程式碼的。比如說告訴面試官知道更相減損法可以求解,基本原理是以較大的數減較小的數,接著把所得的差與較小的數比較,並以大數減小數。繼續這個操作,直到所得的減數和差相等為止。一般這時候面試官就會表示讚許,然後讓你程式碼實現下,接著你就寫出瞭如下的程式碼:

//更相減損法
private static int getCommonDivisor2(int m,int n){
    //非法引數的處理
    if(m <= 0 || n <= 0){
        return -1;
    }
    while(m != n){
        if(m > n){
            m = m - n;
        }else{
            n = n - m;
        }
    }
    return m;
}

怎麼樣,是不是很簡潔!

當然,你也可以用輾轉相除法實現,其基本原理是兩個整數的最大公約數等於其中較小的那個數和兩數相除餘數的最大公約數。程式碼如下:

//輾轉相除法
//兩個整數的最大公約數等於其中較小的那個數和兩數相除餘數的最大公約數
private static int getCommonDivisor3(int m,int n){
    //非法引數的處理
    if(m <= 0 || n <= 0){
        return -1;
    }
    if(m < n){
        int temp = m;
        m = n;
        n = temp;
    }
    int c = m % n;
    while(c != 0){
        m = n;
        n = c;
        c =  m % n;
    }
    return n;
}

一般情況下,能說出最熟悉的一種方法並給出其具體實現就可以了,這道題目基本就過關了。

最後,其實求最大公約數的方法還有很多,比如質因數分解法、短除法等等,大家感興趣的話可以多去了解下,擴充套件下自己的思維。

覺得文章有用的話,點贊+關注唄,好讓更多的人看到這篇文章,也激勵博主寫出更多的好文章。
更多關於演算法、資料結構和計算機基礎知識的內容,歡迎掃碼關注我的原創公眾號「超悅程式設計」。

超悅程式設計

推薦閱讀
為什麼有紅黑樹?什麼是紅黑樹?看完這篇你就明白了
《深入淺出話資料結構》系列之什麼是B樹、B+樹?為什麼二叉查詢樹不行?
都2020年了,聽說你還不會歸併排序?手把手教你手寫歸併排序演算法
為什麼會有多執行緒?什麼是執行緒安全?如何保證執行緒安全?
《一文說透資料結構》系列之什麼是堆?看這一篇就夠了

相關文章