置頂

我的 VPython 教學文件 (HackMD 版本)

VPython 教學文件目錄 安裝及測試 基本語法 等速度直線運動 自由落下 終端速度 水平抛射 使用For迴圈計算水平抛射資料 斜向抛射 圓周運動 簡諧運動 單擺 木塊彈簧系統分離 重力及簡諧 行星運動 相疊木塊 雙重簡諧運動 一維彈性碰撞 ...

熱門文章

2026年9月11日 星期五

LeetCode 解題筆記:3483. Unique 3-Digit Even Numbers

作者:王一哲
日期:2026年9月11日


LeetCode 題目連結:3483. Unique 3-Digit Even Numbers

解題想法


簡單題,題目給一個包含正整數或零的陣列 $digits$,從 $digits$ 之中取出 $3$ 個數字組合成沒有前導零 $3$ 位數的偶數,回傳這樣的數總共有幾種組合。這是我一開始的寫法是用三層 for 迴圈從 $digits$ 之中取數字,最外層的 for 迴圈跑第一位 $x$,如果取出的數字為 $0$ 就跳過;第二層的 for 迴圈跑第二位 $y$,這個位數沒有限制;最內層的 for 迴圈跑第三位 $z$,這個位數只能是偶數。將 $100 x + 10 y + z$ 存入集合 $ans$ 之中,答案為 $ans$ 的長度。因為題目只有 $3$ 位數,這個寫法的速度還算快。

另一個寫法是用三層 for 迴圈枚舉所有的 $3$ 位數偶數,計算這個偶數需要的數字數量,如果 $digits$ 之中可以提併足夠的數字,就將答案 $ans$ 數量加 1。

Python 程式碼


使用集合。Runtime: 15 ms, beats 69.45%. Memory: 19.21 MB, beats 72.53%.
class Solution:
    def totalNumbers(self, digits: List[int]) -> int:
        n = len(digits)
        ans = set()
        for i in range(n):
            x = digits[i]
            if x == 0: continue
            for j in range(n):
                if i == j: continue
                y = digits[j]
                for k in range(n):
                    if k == i or k == j: continue
                    z = digits[k]
                    if z % 2 == 0:
                        ans.add(x*100 + y*10 + z)
        return len(ans)


字典計數。Runtime: 412 ms, beats 7.47%. Memory: 19.28 MB, beats 72.53%.
class Solution:
    def totalNumbers(self, digits: List[int]) -> int:
        cnt = Counter(digits)  # 各種數字的數量
        ans = 0  # 答案
        # 枚舉所有不含前導 0、3 位數的偶數
        for i in range(1, 10):  # 1 ~ 9
            for j in range(10):  # 0 ~ 9
                for k in range(0, 10, 2):  # 2, 4, 6, 8
                    need = Counter([i, j, k])  # 需要的數字數量
                    # digits 之中有足夠的數字,答案加 1
                    if need[i] <= cnt[i] and need[j] <= cnt[j] and need[k] <= cnt[k]:
                        ans += 1
        return ans


表格計數。Runtime: 75 ms, beats 21.10%. Memory: 19.20 MB, beats 92.09%.
class Solution:
    def totalNumbers(self, digits: List[int]) -> int:
        cnt = [0] * 10  # 各種數字的數量
        for digit in digits:
            cnt[digit] += 1
        ans = 0  # 答案
        # 枚舉所有不含前導 0、3 位數的偶數
        for i in range(1, 10):  # 1 ~ 9
            for j in range(10):  # 0 ~ 9
                for k in range(0, 10, 2):  # 2, 4, 6, 8
                    need = [0] * 10  # 需要的數字數量
                    need[i] += 1
                    need[j] += 1
                    need[k] += 1
                    # digits 之中有足夠的數字,答案加 1
                    if need[i] <= cnt[i] and need[j] <= cnt[j] and need[k] <= cnt[k]:
                        ans += 1
        return ans


C++ 程式碼


使用集合。Runtime: 5 ms, beats 72.70%. Memory: 30.96 MB, beats 51.66%.
class Solution {
public:
    int totalNumbers(vector<int>& digits) {
        unordered_set<int> ans;
        int n = (int)digits.size();
        for(int i = 0; i < n; i++) {
            int x = digits[i];
            if (x == 0) continue;
            for(int j = 0; j < n; j++) {
                if (i == j) continue;
                int y = digits[j];
                for(int k = 0; k < n; k++) {
                    if (k == i || k == j) continue;
                    int z = digits[k];
                    if (z % 2 == 0) {
                        ans.insert(x*100 + y*10 + z);
                    }
                }
            }
        }
        return ans.size();
    }
};


表格計數。Runtime: 1 ms, beats 86.61%. Memory: 28.66 MB, beats 93.75%.
class Solution {
public:
    int totalNumbers(vector<int>& digits) {
        int cnt[10] = {0};
        for(int digit : digits) cnt[digit]++;
        int ans = 0;
        for(int i = 1; i <= 9; i++) {
            for(int j = 0; j <= 9; j++) {
                for(int k = 0; k <= 8; k += 2) {
                    int need[10] = {0};
                    need[i]++;
                    need[j]++;
                    need[k]++;
                    if (cnt[i] >= need[i] && cnt[j] >= need[j] && cnt[k] >= need[k]) {
                        ans++;
                    }
                }
            }
        }
        return ans;
    }
};


C 語言程式碼


表格計數。Runtime: 3 ms, beats 42.86. Memory: 9.99 MB, beats 54.29%.
int totalNumbers(int* digits, int digitsSize) {
    int cnt[10] = {0};
    for(int i = 0; i < digitsSize; i++) {
        cnt[digits[i]]++;
    }
    int ans = 0;
    for(int i = 1; i <= 9; i++) {
        for(int j = 0; j <= 9; j++) {
            for(int k = 0; k <= 8; k += 2) {
                int need[10] = {0};
                need[i]++;
                need[j]++;
                need[k]++;
                if (cnt[i] >= need[i] && cnt[j] >= need[j] && cnt[k] >= need[k]) {
                    ans++;
                }
            }
        }
    }
    return ans;
}


沒有留言:

張貼留言