Skip to main content

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 (自由工作者費率計算)

題目描述

幫助自由工作者與客戶溝通專案價格,提供幾個實用函數來快速計算成本。

需求分析

  1. 日薪計算:根據時薪計算日薪(8 小時工作制)
  2. 月薪計算:根據時薪和折扣計算月薪(22 個工作日)
  3. 工作天數計算:根據預算、時薪和折扣計算可工作天數

解題思路

  • 日薪 = 時薪 × 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

https://github.com/thomas-chu-30/swift-ex