Swift 每週五題 LeetCode(8)

LULU
彼得潘的 Swift iOS App 開發教室
6 min readMar 20, 2022

--

嗨嗨~我是這週五發覺到自己是帝寶的孩子(上帝的寶貝簡稱)XD哈哈有聽偷聽史多利的朋友應該會知道😎由於這個週末要到公司加班(ing)所以週五先休了一天假,剛好那天早上我家附近的工業區發生火災大塞車@@讓我逃過遲到保住出勤獎金:D

正題開始!

54. Spiral Matrix(Medium)

老實說這題我逃避了一天:P在想到底怎麼處裡好,最後還是決定給方向直接指示行動位置

func spiralOrder(_ matrix: [[Int]]) -> [Int] {

var result = [Int]()
var top = 0
var left = 0
var bottom = matrix.count - 1
var right = matrix[0].count - 1
var direction = 0

while top <= bottom && left <= right {
if direction % 4 == 0 {
for i in left...right {
result.append(matrix[top][i])
}
top += 1
}
if direction % 4 == 1 {
for i in top...bottom {
result.append(matrix[i][right])
}
right -= 1
}
if direction % 4 == 2 {
for i in stride(from: right, through: left, by: -1) {
result.append(matrix[bottom][i])
}
bottom -= 1
}
if direction % 4 == 3 {
for i in stride(from: bottom, through: top, by: -1) {
result.append(matrix[i][left])
}
left += 1
}
direction += 1
}

return result
}

55. Jump Game(Medium)

這題也花了一點時間理解題目,最初位於陣列的第一個index,數組中的每個元素都代表在該位置的最大跳躍長度,如果可以到達最後一個返回 true,否則返回 false。
https://leetcode.com/problems/jump-game/

func canJump(_ nums: [Int]) -> Bool {
var jump = 0
var i = 0

while i <= jump {
jump = max(jump, i + nums[i])
i += 1
if jump >= nums.count - 1 {
return true
}
}
return false
}

56. Merge Intervals(Medium)

題目中[[1, 3][2, 6]],從1到6中間會有2, 3, 4, 5合併所有重疊區間,並返回一個包含輸入中所有區間的”非重疊”區間數組,所以最後輸出會是[1, 6]。

func merge(_ intervals: [[Int]]) -> [[Int]] {
var result: [[Int]] = []
var arr = intervals.sorted { left, right in
left[0] < right[0]
}
var now = arr[0] //當下的位置
for i in 1..<arr.count { //從[0]開始所以回圈從第一個位置開始檢查
if now[1] >= arr[i][0] { //若陣列中[1]比前者大
now = [now[0],max(now[1], arr[i][1])] //now=當下或是較大的
} else {
result.append(now)
now = arr[i]
}
}
result.append(now)
return result
}

62. Unique Paths(Medium)

這幾題都是這種棋盤類型的題目QQ
https://www.youtube.com/watch?v=zQ6lx5tZ1Xw

請直接看影片解說比較清楚,再附上Swift解法
https://leetcode.com/problems/unique-paths/

func uniquePaths(_ m: Int, _ n: Int) -> Int {
var result = Array(repeating: 1, count: n)
for i in 1..<m {
for k in 1..<n {
result[k] = result[k] + result[k-1]
}
}
return result[n-1]
}

66. Plus One(Easy)

簡單來說就是將整數加一併返回結果數字陣列。
https://leetcode.com/problems/plus-one/

func plusOne(_ digits: [Int]) -> [Int] {
var carry: Int = 1
var result = digits

for i in stride(from: digits.count - 1, to: -1, by: -1) {
let value = (digits[i] + carry) % 10
carry = (digits[i] + carry) / 10
result[i] = value
}
if carry == 1 {
result.insert(1, at: 0)
}
return result
}

補充stride用法:
https://medium.com/%E5%BD%BC%E5%BE%97%E6%BD%98%E7%9A%84-swift-ios-app-%E9%96%8B%E7%99%BC%E5%95%8F%E9%A1%8C%E8%A7%A3%E7%AD%94%E9%9B%86/swift-3%E7%9A%84for%E8%BF%B4%E5%9C%88%E4%B8%8D%E5%8F%AA%E6%9C%83%E6%AF%8F%E6%AC%A1%E5%8A%A01-5d4d6e14197

--

--

LULU
彼得潘的 Swift iOS App 開發教室

Hi👋 I’m iOS developer, I hope I can grow with you guys ☺️ Let’s learn more together.