每日一題
日期
2025/9/22
程式碼
以 Example 1 為例
Input: nums = [1,2,2,3,1,4]
class Solution {
func maxFrequencyElements(_ nums: [Int]) -> Int {
nums
// 1. 計算每一個數字出現幾次
// Output - [3: 1, 4: 1, 2: 2, 1: 2]
.reduce(into: [Int: Int]()) { $0[$1, default: 0] += 1 }
// 2. 計算每一種出現次數各自有幾次
// Output - [2: 2, 1: 2]
.reduce(into: [Int: Int]()) { $0[$1.value, default: 0] += 1 }
// 3. 找出最大數字次數出現次數
// Output - Optional((key: 2, value: 2))
// 敘述:出現 2 次 (key) 的有 2 個 (value) 數字
.max { $0.key < $1.key }
// 4. 算出題目想要的答案。
// 因為 .max 的返回值是 Optional ,所以需要 `?? 0`
// Output - 4
.map { $0.key * $0.value } ?? 0
}
}
用 grouped(by:)
送出之後看到 iamhands0me 的解法 ,才想到可以用 grouped(by:)
,但是邏輯上很神奇的大同小異。
在逐行看 output 就發現途中會生成一些 dictionary ,好奇會不會影響空間複雜度?但是程式碼本身是簡潔好讀多了。
class Solution {
func maxFrequencyElements(_ nums: [Int]) -> Int {
nums
// 1. 因為是分組,所以 `value` 是被群組起來的陣列
// [3: [3], 2: [2, 2], 4: [4], 1: [1, 1]]
.grouped(by: \.self)
// 2. 有保留 key-value 的 signature
// [1: [(key: 4, value: [4]), (key: 3, value: [3])], 2: [(key: 1, value: [1, 1]), (key: 2, value: [2, 2])]]
.grouped(by: \.value.count)
.max { $0.key < $1.key }
.map { $0.key * $0.value.count } ?? 0
}
}