題目
第一部分
今天的題目可以用正規表示式,根據提議可以分兩層
- 先找出
mul(數字,數字)
,而數字為 1~3 位數- 正規表示式:
mul\(\d{1,3},\d{1,3}\)
- 正規表示式:
- 將找出來的字串,再吻合出兩個數字
- 正規表示式:
\d{1,3}
- 正規表示式:
- 把兩個數字相乘
- 把所有的乘積加總起來
func multiplications(string: String) -> Int {
let basePattern = /mul\(\d{1,3},\d{1,3}\)/
let numberPattern = /\d{1,3}/
// 1. 找出 mul(數字,數字)
let matches = string.matches(of: basePattern).map { String($0.output) }
return matches
.map {
// 2., 3. 找出吻合的兩個數字並相乘
$0.matches(of: numberPattern).compactMap{ Int($0.output) }.reduce(into: 1, *=)
}
// 4. 加總
.reduce(into: 0, +=)
}
第二部分
第二部分加上一個變形,當遇到 don't()
的時候,接下來的 mul
不能被加總,當遇到 do()
的時候,接下來的 mul
就都能被加總。
- 找出所有的
do()
don't()
mul(數字,數字)
- 正規表示式:
(do\(\)|don't\(\)|mul\(\d{1,3},\d{1,3}\))
- 正規表示式:
- 走訪吻合的結果
- 設定一個可否加總的 flag 並預設為 true
- 遇到
do()
則為true
- 遇到
don't()
則為true
- 其他預設則都是
mul(數字,數字)
,當 flag 為 true 時,就像第一部分一樣相乘後加總
func modMultiplications(string: String) -> Int {
let basePattern = /(do\(\)|don't\(\)|mul\(\d{1,3},\d{1,3}\))/
let numberPattern = /\d{1,3}/
let matches = string.matches(of: basePattern).map { $0.output.0 }
var flag = true
var result = 0
for match in matches {
if match == "do()" {
flag = true
} else if match == "don't()" {
flag = false
} else if flag {
result += match.matches(of: /\d+/).compactMap { Int($0.output) }.reduce(into: 1, *=)
}
}
return result
}
結語
如果有寫錯或有建議請留言讓我知道。如果有找到更好的解法,我會再多發一篇補充。
Top comments (0)