iOS 算法题常用代码片段(Swift 版本)

向上向下取整

print(ceil(1.5))  // 向上取整 2
print(floor(1.5)) // 向下取整 1

四舍五入

print(lround(1.4)) // 1
print(lround(1.5)) // 2

直接截断小数部分

  • 使用强制转换会将浮点部分去除
print(Int(1.4)) // 1
print(Int(1.5)) // 1

保留指定小数位

  • 保留两位小数
var f = 123.123
var s = String(format:"%.2f", f)
print(s) // 123.12

前置位补0

  • 不足两位时前面补0
var f = 1
var s = String(format:"%.2d", f)
print(s) // 01

相除

print(3 / 2) // 1 不是 2
print(ceil(3 / 2)) // 2.0

取余数 取模

print(3 % 2) // 1
// 浮点数取余
print(3.5.truncatingRemainder(dividingBy: 2)) // 1.5

最大值 最小值

print(max(1, 3, 2)) // 3
print(min(1, 3.3)) // 1.0

绝对值

print(abs(-12)) // 12
print(abs(13.1)) // 13.1

开方

let a = sqrt(9)
print(a) // 3.0

π

print(Float.pi) // 3.1415925
print(Double.pi) // 3.141592653589793

ASCII

ASCII码一共128个
常见ASCII码的大小规则:0-9<A-Z<a-z
几个常见字母的ASCII码大小: “A”为65;“a”为97;“0”为 48

  • 判断字符是否是 ASCII
let char1: Character = "a"
print(char1.isASCII) // true
let char2: Character = "🐶"
print(char2.isASCII) // false
  • 获取字符的 ASCII 码值
let char1: Character = "a"
print(char1.asciiValue ?? "木有") // 97
let char2: Character = "🐶"
print(char2.asciiValue ?? "木有") // 木有
  • 通过 ASCII 码值转字符
let asciiValue = 97
let char: Character = Character(UnicodeScalar(asciiValue)!)
print(char) // a

字符串遍历

let str: String = "abc"
str.forEach { char in
    print(char) // a b c
}

字符串分割

  • 指定分割字符
let str = "a b c"
let array = str.split(separator: " ")
print(array) // ["a", "b", "c"]
  • 指定分割字符集
let string = "1@2#3@4#5"
let array2 = string.components(separatedBy: CharacterSet.init(["@", "#"]))
print(array2) // ["1", "2", "3", "4", "5"]
  • 指定分割条件
let str = "abcde"
let array = str.split { char in
    return char == "b" || char == "d"
}
print(array) // ["a", "c", "e"]
  • 指定最大分割次数
let string = "1@2#3@4#5"
// maxSplits表示最大分割次数
let array4 = string.split(separator: "@", maxSplits: 1, omittingEmptySubsequences: false)
print(array4) // ["1", "2#3@4#5"]
  • 是否忽略空字符串
// omittingEmptySubsequences表示忽略空字符串
let string = "1@2#3@4#5"
let array5 = "1#2#".split(separator: "#", maxSplits: Int.max, omittingEmptySubsequences: false)
print(array5) // ["1", "2", ""]
let array6 = "1#2#".split(separator: "#", maxSplits: Int.max, omittingEmptySubsequences: true)
print(array6) // ["1", "2"]

字符串转字符数组

let str = "abc"
let array = str.map { $0 }
print(array) // ["a", "b", "c"]

字符串截取

  • 截取前几位
let str: String = "abcd"
let prefix = str.prefix(2)
print(prefix) // ab
  • 截取后几位
let str: String = "abcd"
let suffix = str.suffix(2)
print(suffix) // cd
  • 去掉前几位
let str = "abcd"
let dropStr = str.dropFirst(2)
print(dropStr) // cd
  • 去掉后几位
let str = "abcd"
let dropStr = str.dropLast(2)
print(dropStr) // ab
  • 截取指定范围
// NSString 和 NSRange 才是王道
let str1: NSString = "abcde"
let range: NSRange = NSRange(location: 1, length: 2)
let subString = str1.substring(with: range)
print(subString) // bc
  • 不用 range 截取
let str = "abcdef"
let dropStr = str.dropFirst(2).prefix(2)
print(dropStr) // cd

字符串包含

var str = "abcdef"
if str.contains("abc") {
    print("contain")
} else {
    print("not contain")
}

字符串查找

  • 查找子字符串的范围
// 用 NSString 和 NSRange 会简单很多
let str1: NSString = "abcde"
let str2: NSString = "bcd"
let range = str1.range(of: String(str2))
print(range) // {1, 3}

数组遍历

var array = [1, 2, 3]
array.forEach { item in
    print(item) // 1 2 3
}
  • 同时获取元素和下标:
let array = ["a", "b", "c"]
for (index, item) in array.enumerated() {
    print("第\(index)个元素是\(item)") // 第0个元素是a ..
}

数组截取

  • 使用区间运算符
var array = [1, 2, 3]
let array2 = array[0..<2]
print(array2) // [1, 2]
  • 单侧区间
let array = [1, 2, 3, 4, 5]
print(array[1...]) // [2, 3, 4, 5]
print(array[...2]) // [1, 2, 3]
print(array[..<2]) // [1, 2]
  • 获取前几个元素
let array = [1, 2, 3, 4, 5]
print(array.prefix(3)) // [1, 2, 3]
  • 获取后几个元素
let array = [1, 2, 3, 4, 5]
print(array.suffix(3)) // [3, 4, 5]

数组替换

// NSRange 才是王道
var array = [1, 2, 3, 4, 5]
var range = Range(NSRange.init(location: 1, length: 2))
array.replaceSubrange(range!, with: [6])
print(array) // [1, 6, 4, 5]
  • 使用区间运算符
var array = [1, 2, 3, 4, 5]
array[1...3] = [666]
print(array) // [1, 666, 5]

数组反转

  • 直接反转原数组
var array = [1, 2, 3]
array.reverse()
print(array) // [3, 2, 1]
  • 生成新数组
let array = [1, 2, 3]
let array2 = array.reversed()
print(array2) // [3, 2, 1]

数组排序

var array = [2, 1, 3]
// 默认从小到大排序
array.sort()
print(array) // 1 2 3
var array = [2, 1, 3]
// 从大到小排序
array.sort(by: >)
print(array) // 3 2 1
var array = [2, 1, 3]
// 按指定条件排序
let sortedArray = array.sorted { a, b in
    return a > b
}
print(sortedArray) // 3 2 1

数组映射

let array = [1, 2, 3]
let array2 = array.map { item in
    item * item
}
print(array2) // [1, 4, 9]
  • 使用 compactMap 过滤空值
let possibleNumbers = ["1", "2", "three", "///4///", "5"]
let mapped: [Int?] = possibleNumbers.map { str in Int(str) }
print(mapped) // [1, 2, nil, nil, 5]
let compactMapped: [Int] = possibleNumbers.compactMap { str in Int(str) }
print(compactMapped) // [1, 2, 5]

数组过滤

let array = [1, 2, 3, 4, 5]
let array2 = array.filter { item in
    item > 3
}
print(array2) // [4, 5]

数组包含

let array = ["a", "b", "c", "a"]
if array.contains("a") {
    print("包含")
}

数组查询

  • 查询元素在数组中第一次出现的index
let array = ["a", "b", "c", "a"]
if let a = array.firstIndex(of: "a") {
    print("a第一次出现的index是\(a)") // 0
} else {
    print("无此元素")
}
  • 查询元素在数组中最后一次出现的index
let array = ["a", "b", "c", "a"]
if let a = array.lastIndex(of: "a") {
    print("a最后一次出现的index是\(a)") // 3
} else {
    print("无此元素")
}
  • 查找数组中的最大元素最小元素
let array = ["a", "b", "c", "a"]
print(array.max() ?? "无最大元素") // c
print(array.min() ?? "无最小元素") // a
  • 是否所有元素都满足指定条件
let array = [1, 2, 3]
if array.allSatisfy({ item in
    item > 0
}) {
    print("所有元素都大于0")
}

字典遍历

let dict: [String: Int] = ["age": 20, "weight": 90]
dict.forEach { item in
    print(item)
}

字典转数组

let keys = dict.keys
let values = dict.values
print(keys) // ["age", "weight"]
print(values) // [20, 90]
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
实现中等难度通讯录。需求: 1、定义联系⼈类Contact。实例变量:姓名(拼⾳,⾸字⺟⼤写)、性别、电话号码、 住址、分组名称、年龄。⽅法:⾃定义初始化⽅法(姓名、电话号码)、显⽰联系⼈信息 2、在main.m中定义字典,分组管理所有联系⼈。分组名为26个⼤写的英⽂字⺟。 3、可以添加联系⼈对象,如果姓名或电话号码为空,添加失败。添加联系⼈到匹配的分 组。 4、获取某个分组名称下所有联系⼈,并且按照姓名升序排列。 5、从通讯录中根据电话号码搜索联系⼈。 6、获取所有⼥性的联系⼈,并且按照年龄的降序排列。 7、根据姓名删除某个联系⼈。 8、删除某个分组的全部联系⼈。 二.处理⼯程⽂件crayons.txt中的⽂本信息,⽂本内容是关于颜⾊的,每⾏都是⼀ 个颜⾊的信息,例如:Almond #EED9C4,前⼀个字符串是颜⾊的名称,后⼀ 个字符串是颜⾊的16进制⾊值,处理⽂本完成如下需求 1、使⽤字典管理所有的颜⾊,即字典中存储的是多个键值对,颜⾊名称为 key,16进制颜⾊值(不带#)是value。 2、取出所有的key,升序排列。 3、取出所有的value,按照排序后的key排列。 4、使⽤⼀个新的字典管理颜⾊,对颜⾊进⾏分类管理,即:“A”,“B”,“C”… 即这个字典包含多个键值对,key是26个字⺟,value是数组,数组⾥存放的是 Color对象(包含name和colorValue)。需要⾃⼰创建Color类。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

祖安狂人学编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值