// 整理撲克牌
func HW2023025() {
// 測試用例
// let inputStr = "1 1 1 2 3 3 3 4 4 4 5 5 5"
// let inputStr = "1 3 3 3 2 1 5"
// let inputStr = "4 4 2 1 2 1 3 3 3 4"
// 開始代碼
let inputStr = String(readLine()!)
// 使用高階函數(shù)將字符串轉(zhuǎn)成字典并統(tǒng)計各字符出現(xiàn)次數(shù)
let inputDic = inputStr.replacingOccurrences(of: " ", with: "").reduce(into: [Character: Int]()) { res, key in
res[key] = Int(res[key] ?? 0) + 1
}
// 字典按字符出現(xiàn)次數(shù)降序排列,次數(shù)一樣按字符大小降序排列
let valueDic = inputDic.sorted { a, b in
if a.value == b.value { // 張數(shù)一樣,點(diǎn)數(shù)多的排在前面
return a.key > b.key
}
return a.value > b.value // 張數(shù)多的排在前面
}
// 將字典轉(zhuǎn)化成數(shù)組
var list: [[Character: Int]] = []
for (k,v) in valueDic {
list.append([k: v])
}
var res = "" // 記錄最后的結(jié)果
var chaiFen: Set<Character> = [] // 需要拆分的點(diǎn)數(shù),可能是多個所以用集合
for (i,dic) in list.enumerated() {
var temp = dic
let carNum = temp.keys.first!
var carCount = temp.values.first!
// 當(dāng)碰到前面是三張,此牌也是三張時,就需要拆分,因為葫蘆大于三張
if i > 0 && list[i-1].values.first == 3 && carCount == 3 {
chaiFen.insert(carNum) // 將需要拆分的點(diǎn)數(shù)存入集合
carCount = 2 // 將當(dāng)前點(diǎn)數(shù)置為2
temp.updateValue(2, forKey: carNum) // 將當(dāng)前點(diǎn)數(shù)對應(yīng)的字典值修改
list[i] = temp // 修改字典里保存該位置的字典
}else if carCount == 1 && chaiFen.count != 0 { // 此時是單張,需要注意拆分的牌
for chai in chaiFen {
if chai > carNum { // 如果拆分的牌大于當(dāng)前單張,則先安排拆分牌
res.append("\(String(chai)) ")
chaiFen.remove(chai) // 安排完后,將當(dāng)前拆分牌從集合中移除
}
}
}
for _ in 0..<carCount {
res.append("\(String(carNum)) ")
}
}
if chaiFen.count != 0 { // 如果最后拆分的集合沒有安排完,則一次安排完拆分牌
for chai in chaiFen {
res.append("\(String(chai)) ")
}
}
print(res.trimmingCharacters(in: .whitespaces))
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。