一條有趣的前端面試題(2)

在網上看到這么一條十分有趣的題目:

你是一名體育老師,在某次課距離下課還有五分鐘時,你決定搞一個游戲。此時有100名學生在上課。游戲的規則是:

  1. 你首先說出三個不同的特殊數,要求必須是個位數,比如3、5、7。
  2. 讓所有學生拍成一隊,然后按順序報數。
  3. 學生報數時,如果所報數字是第一個特殊數(3)的倍數,那么不能說該數字,而要說Fizz;如果所報數字是第二個特殊數(5)的倍數,那么要說Buzz;如果所報數字是第三個特殊數(7)的倍數,那么要說Whizz。
  4. 學生報數時,如果所報數字同時是兩個特殊數的倍數情況下,也要特殊處理,比如第一個特殊數和第二個特殊數的倍數,那么不能說該數字,而是要說FizzBuzz, 以此類推。如果同時是三個特殊數的倍數,那么要說FizzBuzzWhizz。
  5. 學生報數時,如果所報數字包含了第一個特殊數,那么也不能說該數字,而是要說相應的單詞,比如本例中第一個特殊數是3,那么要報13的同學應該說Fizz。如果數字中包含了第一個特殊數,那么忽略規則3和規則4,比如要報35的同學只報Fizz,不報BuzzWhizz。

現在,我們需要你完成一個程序來模擬這個游戲,它首先接受3個特殊數,然后輸出100名學生應該報數的數或單詞

看到這道題,我的第一反應想到的就是%取模,for循環,思路還算是清晰吧。那么我們再進行細致點的分析,條件上有3個點,

  1. 只是一個特殊數的倍數
  2. 兩個或者三個特殊數的倍數
  3. 包涵第一個特殊數的特殊情況!

那么我們首先要做的是for一個1~100來吧,然后,判斷每個數字,是否匹配這幾個條件。

function num() {
    var arr = [3, 5, 7];
    var str = ["Fizz", "Buzz", "Whizz"];
    for (var i = 1; i <= 100; i++) {
        var strr;
        if (i % arr[0] !== 0 && i % arr[1] !== 0 && i % arr[2] !== 0) {
            strr = i;
        }
        if (i % arr[1] == 0) {
            strr += "Buzz";
        }
        if (i % arr[1] == 0) {
            strr += "Buzz";
        }
        if (i % arr[2] == 0) {
            strr += "Whizz";
        }
    }
}

寫到這里的時候我陷入的瓶頸,好多的判斷啊,很麻煩,左思右想的,突然想起了,三元運算符,一下子,就通了。

//a為1~100之間的數
//b為特殊數
//c為為特殊數對應的輸出
//這個方法是 判斷是否為特殊數
function str(a, b, c) {
    return a % b === 0 ? c : "";
}

function num() {
    var arr = [3, 5, 7];
    var str = ["Fizz", "Buzz", "Whizz"];
    for (var i = 1; i <= 100; i++) {
        //因為條件2 說明遇到同時是兩個或者3個特殊數的倍數時,需要疊加
        var str = str(i, arr[0], str[0]) + str(i, arr[1], str[1]) + str(i, arr[2], str[2]);
    }
}

此時,變量str的值,不是為“”,就是為特殊字符。接下來,需要做出判斷,當str=“”時,我們希望輸出的是i。另外,還有條件3 的沒有進行判斷。

//a為1~100之間的數
//b為特殊數
//c為為特殊數對應的輸出
//這個方法是 判斷是否為特殊數
function Rstr(a, b, c) {
    return a % b === 0 ? c : "";
}

function num() {
    var arr = [3, 5, 7];
    var str = ["Fizz", "Buzz", "Whizz"];
    for (var i = 1; i <= 100; i++) {
        //因為條件2 說明遇到同時是兩個或者3個特殊數的倍數時,需要疊加
        var str2 = Rstr(i, arr[0], str[0]) + Rstr(i, arr[1], str[1]) + Rstr(i, arr[2], str[2]);
        var res;
        if ((i + "").indexOf(arr[0]) !== -1) {
            res = str[0];
        } else if (str2 == "") {
            res = i;
        } else {
            res = str2;
        }
        console.log(res)
    }
}

很好,輸出的就是我們要的結果。再進一步的優化下代碼!運用的還是三元運算符。最終代碼為:

//a為1~100之間的數
//b為特殊數
//c為為特殊數對應的輸出
//這個方法是 判斷是否為特殊數
function Rstr(a, b, c) {
    return a % b === 0 ? c : "";
}
//x,y,z為特殊數
function num(x, y, z) {
    for (var i = 1; i <= 100; i++) {
        //因為條件2 說明遇到同時是兩個或者3個特殊數的倍數時,需要疊加
        var str2 = Rstr(i, x, "Fizz") + Rstr(i, y, "Buzz") + Rstr(i, z, "Whizz");
        console.log((i + "").indexOf(x) !== -1 ? "Fizz" : str2 !== "" ? str2 : i)
    }
};
num("3", "5", "7")
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 即使水墨丹青,何以繪出半妝佳人。 Scala是一門優雅而又復雜的程序設計語言,初學者很容易陷入細節而迷失方向。這也...
    劉光聰閱讀 3,066評論 4 9
  • 序言 控制復雜性是計算機編程的本質。—— Brian Kernighan 有一次給某團隊培訓TDD時,團隊選擇的語...
    _張曉龍_閱讀 1,283評論 0 4
  • 經過一段時間的籌備,我們的實驗室現在要開始納新啦~ 當然我們也是要經過面試的呀親愛的們 你們期待已久的面試題出爐啦...
    977777閱讀 1,188評論 0 0
  • FizzBuzzWhizz 你是一名體育老師,在某次課距離下課還有五分鐘時,你決定搞一個游戲。此時有100名學生在...
    豹紋奶嘴草上飛閱讀 383評論 0 1
  • 問題 你是一名體育老師,在某次課距離下課還有五分鐘時,你決定搞一個游戲。此時有100名學生在上課。游戲的規則是: ...
    davidhuangdw閱讀 758評論 0 1