Swift LeetCode 練習
1. Difference of Squares (平方差)
題目描述
找出前 N 個自然數的和的平方與平方的和之間的差值。
範例
前 10 個自然數的和的平方:(1 + 2 + ... + 10)² = 55² = 3025
前 10 個自然數的平方和:1² + 2² + ... + 10² = 385
差值:3025 - 385 = 2640
解題思路
使用數學公式來計算:
- 和的平方:(1 + 2 + ... + n)² = [n(n+1)/2]²
- 平方和:1² + 2² + ... + n² = n(n+1)(2n+1)/6
Swift 實作
class Squares {
let n: Int
init(_ n: Int) {
self.n = n
}
// (1 + 2 + ... + n)^2
var squareOfSum: Int {
let sum = n * (n + 1) / 2
return sum * sum
}
// 1^2 + 2^2 + ... + n^2
var sumOfSquares: Int {
return n * (n + 1) * (2 * n + 1) / 6
}
// squareOfSum - sumOfSquares
var differenceOfSquares: Int {
return squareOfSum - sumOfSquares
}
}
2. Gigasecond (十億秒)
題目描述
計算某個日期加上一 gigasecond(十億秒)後的日期和時間。
背景知識
- 1 gigasecond = 1,000,000,000 秒
- 這個概念來自科幻小說《A Deepness in the Sky》
- 使用公制系統作為時間測量的基礎
範例
如果出生於 2015 年 1 月 24 日 22:00,那麼在 2046 年 10 月 2 日 23:46:40 時就滿一 gigasecond。
解題思路
使用 Swift 的 Date 類別和 addingTimeInterval 方法,直接加上十億秒的時間間隔。
Swift 實作
import Foundation
func gigasecond(from: Date) -> Date {
return from.addingTimeInterval(1_000_000_000)
}
3. Freelancer Rates (自由工作者費率計算)
題目描述
幫助自由工作者與客戶溝通專案價格,提供幾個實用函數來快速計算成本 。
需求分析
- 日薪計算:根據時薪計算日薪(8 小時工作制)
- 月薪計算:根據時薪和折扣計算月薪(22 個工作日)
- 工作天數計算:根據預算、時薪和折扣計算可工作天數
解題思路
- 日薪 = 時薪 × 8 小時
- 月薪 = 日薪 × 22 天 × (1 - 折扣率)
- 工作天數 = 預算 ÷ (日薪 × (1 - 折扣率))
Swift 實作
// 根據時薪計算日薪
func dailyRateFrom(hourlyRate: Int) -> Double {
return Double(hourlyRate) * 8.0
}
// 根據時薪和折扣計算月薪(四捨五入到整數)
func monthlyRateFrom(hourlyRate: Int, withDiscount discount: Double) -> Double {
let monthlyRate = Double(hourlyRate) * 8.0 * 22.0
let discounted = monthlyRate * (1 - discount / 100.0)
return discounted.rounded()
}
// 根據預算、時薪和折扣計算可工作天數(向下取整)
func workdaysIn(budget: Double, hourlyRate: Int, withDiscount discount: Double) -> Double {
let dailyRate = Double(hourlyRate) * 8.0 * (1 - discount / 100.0)
let days = budget / dailyRate
return days.rounded(.down)
}
範例使用
// 時薪 50 元
let dailyRate = dailyRateFrom(hourlyRate: 50) // 400.0
let monthlyRate = monthlyRateFrom(hourlyRate: 50, withDiscount: 10) // 7920.0
let workdays = workdaysIn(budget: 20000, hourlyRate: 50, withDiscount: 10) // 50.0
rounded
let number = 3.5
// 四捨五入(預設)
number.rounded() // 4.0
// 向上捨入
number.rounded(.up) // 4.0
// 向下捨入
number.rounded(.down) // 3.0
// 向零捨入
number.rounded(.towardZero) // 3.0
// 遠離零捨入
number.rounded(.awayFromZero) // 4.0
// 到最近的偶數(銀行家捨入法)
number.rounded(.toNearestOrAwayFromZero) // 4.0