首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 實作拉鉤網 FizzBuzzWhizz 面試題完整解法

     編輯:Java 相關知識

題目規則(FizzBuzzWhizz 進階版)

給定三個特殊數字 a, b, c(通常為 3, 5, 7),對範圍 [start, end] 內的每個整數:

  1. 若數字包含 a(個位或十位) → 輸出 Fizz(優先級最高)。
  2. 若能被 a 整除 → Fizz。
  3. 若能被 b 整除 → Buzz。
  4. 若能被 c 整除 → Whizz。
  5. 若同時能被 a,b 整除 → FizzBuzz。
  6. 若同時能被 a,c 整除 → FizzWhizz。
  7. 若同時能被 b,c 整除 → BuzzWhizz。
  8. 以上皆否 → 輸出數字本身。

優先級:包含數字 > 組合整除 > 單一整除 > 數字本身。

完整 Java 解法

public class FizzBuzzWhizz {

    public static void main(String[] args) {
        fizzBuzzWhizz(1, 100, 3, 5, 7);
    }

    /**
     * @param start 起始數字(含)
     * @param end   結束數字(含)
     * @param a     特殊數字 A(預設 3)
     * @param b     特殊數字 B(預設 5)
     * @param c     特殊數字 C(預設 7)
     */
    public static void fizzBuzzWhizz(int start, int end, int a, int b, int c) {
        String[] out = {"Fizz", "Buzz", "Whizz", "FizzBuzz", "FizzWhizz", "BuzzWhizz"};

        for (int i = start; i <= end; i++) {
            int idx = -1;

            // 1. 最高優先級:數字包含 a
            boolean containsA = (i % 10 == a) || (i / 10 == a); // 兩位數足夠,大數可用 String.contains
            if (containsA) idx = 0; // Fizz

            // 2. 組合整除(按優先級:ab > ac > bc)
            if (idx == -1) {
                if (i % a == 0 && i % b == 0) idx = 3;      // FizzBuzz
                else if (i % a == 0 && i % c == 0) idx = 4;  // FizzWhizz
                else if (i % b == 0 && i % c == 0) idx = 5;  // BuzzWhizz
            }

            // 3. 單一整除
            if (idx == -1) {
                if (i % a == 0) idx = 0;       // Fizz
                else if (i % b == 0) idx = 1;  // Buzz
                else if (i % c == 0) idx = 2;  // Whizz
            }

            // 4. 輸出
            System.out.println(idx == -1 ? i : out[idx]);
        }
    }
}

關鍵邏輯說明

順序條件輸出備註
1數字包含 a(如 13, 30, 31...)Fizz最高優先級,無論是否能整除
2能被 a,b 整除FizzBuzz
3能被 a,c 整除FizzWhizz
4能被 b,c 整除BuzzWhizz
5能被 a 整除Fizz
6能被 b 整除Buzz
7能被 c 整除Whizz
8以上皆無數字本身

擴展:任意位數「包含數字」判斷

// 替換 containsA 判斷
boolean containsA = String.valueOf(i).contains(String.valueOf(a));

單元測試範例

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;

class FizzBuzzWhizzTest {
    @Test void testContains3() { assertEquals("Fizz", run(13, 3, 5, 7)); }
    @Test void testDiv3() { assertEquals("Fizz", run(6, 3, 5, 7)); }
    @Test void testDiv5() { assertEquals("Buzz", run(10, 3, 5, 7)); }
    @Test void testDiv7() { assertEquals("Whizz", run(14, 3, 5, 7)); }
    @Test void testDiv3And5() { assertEquals("FizzBuzz", run(15, 3, 5, 7)); }
    @Test void testDiv3And7() { assertEquals("FizzWhizz", run(21, 3, 5, 7)); }
    @Test void testDiv5And7() { assertEquals("BuzzWhizz", run(35, 3, 5, 7)); }
    @Test void testNormal() { assertEquals("11", run(11, 3, 5, 7)); }

    private String run(int n, int a, int b, int c) {
        // 呼叫核心邏輯並捕獲輸出
        return "..."; // 略
    }
}

面試加分點

  • 清晰說明優先級邏輯,避免 if-else 順序錯誤。
  • 將規則提取為配置/策略模式,支援動態規則擴展。
  • 考慮大數字「包含」判斷用 String.contains 而非數學運算。
  • 編寫單元測試覆蓋所有分支。
  • 討論效能:O(N) 時間、O(1) 空間,無法進一步優化。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved