- 字符串(8道):
- 剑指Offer (5):替换空格
- 剑指Offer(19):正则表达式匹配
- 剑指Offer(20):表示数值的字符串
- 剑指Offer(38):字符串的排列
- 剑指Offer(50):第一个只出现一次的字符
- 剑指Offer(58):翻转单词顺序序列
- 剑指Offer(58):左旋转字符串
- 剑指Offer(67):把字符串转换成整数
面试题5:替换空格
题目一
思路一
思路二
代码
func replaceSpace(_ s: String) -> String {
guard s.count > 0 else { return "" }
var chars = Array(s)
var count = 0
var oldEnd = chars.count - 1
// 计算空格数
for char in chars {
if char == " " { count += 1 }
}
// 计算扩容数量
var newCount = count * 2 + chars.count
// 扩容
for i in 0..<count * 2 { chars.append(" ") }
// 从后往前替换
var newEnd = chars.count - 1
while newEnd >= 0 && oldEnd >= 0 {
if chars[oldEnd] != " " {
chars[newEnd] = chars[oldEnd]
} else {
chars[newEnd] = "0"
chars[newEnd - 1] = "2"
chars[newEnd - 2] = "%"
newEnd -= 2
}
newEnd -= 1
oldEnd -= 1
}
return String(chars)
}
面试题19:正则表达式匹配
题目一
- 略
面试题20:表示数值的字符串
题目一
- 略
面试题50:第一个只出现一次的字符
题目一
思路一
func firstUniqChar(_ s: String) -> Character {
var dict = [Character:Int]()
for i in s {
if let v = dict[i] {
dict[i] = v + 1
} else {
dict[i] = 1
}
}
for i in s {
if let v = dict[i] {
if v == 1 {
return i
}
}
}
return " "
}
面试题58:翻转字符串
题目一
思路一
代码
func reverseWords(_ s: String) -> String {
if s.count == 0 {
return s
}
var trs = [Character](trimAndExtrusionWhitespaces(s)).reversed() as [Character]
var start = 0, end = 0
while start < trs.count {
while end < trs.count && trs[end] != " " {
end += 1
}
reversed(&trs, l: start, r: end - 1)
end += 1
start = end
}
return String(trs)
}
func reversed(_ s: inout [Character], l: Int, r: Int) {
var i = l, j = r
while i < j {
s.swapAt(i, j)
i += 1
j -= 1
}
}
//去掉收尾空格并把中间多个空格合并为一个空格
func trimAndExtrusionWhitespaces(_ s: String) -> String {
return s.trimmingCharacters(in: .whitespaces).components(separatedBy: .whitespaces).filter { $0 != "" }.joined(separator: " ")
}
思路二:swift高阶函数
代码
func reverseWords(_ s: String) -> String {
return s.split(separator: " ")
.reversed()
.joined(separator: " ")
}
思路三:数组
代码
func reverseWords(_ s: String) -> String {
var word = [Character]() // 装填每个字母
var words = [[Character]]() // 装填每个单词
for item in s {
// 略过多余空格
if item == " " && word.count == 0 {
continue
}
// 装填一次单词
else if item == " " && word.count != 0{
words.append(word)
word.removeAll()
}
// 添加单词
else {
word.append(item)
}
}
// 添加最后一个单词
if word.count != 0 { words.append(word) }
var str = ""
let count = words.count
while words.count != 0 {
// 非第一个单词,添加一个空格
if words.count != count {str.append(" ")}
// 倒叙添加单词
str = str + words.popLast()!
}
return str
}
题目二
思路一
代码
func reverseLeftWords(_ s: String, _ n: Int) -> String {
if s.isEmpty || n == 0 {
return s
}
var chs = [Character](s)
let end = chs.count - 1
reversed(&chs, start: 0, end: n - 1)
reversed(&chs, start: n, end: end)
reversed(&chs, start: 0, end: end)
return String(chs)
}
func reversed(_ chs: inout [Character], start: Int, end: Int) {
var start = start, end = end
if start < chs.count && end < chs.count && start < end {
while start < end {
chs.swapAt(start, end)
start += 1
end -= 1
}
}
}
思路二:swift高阶函数
func reverseLeftWords(_ s: String, _ n: Int) -> String {
return s.substring(from: n) + s.substring(to: n)
}
面试题67:把字符串转换成整数
略