最近看到一道算法题,觉得还是蛮有意思的,就尝试着用swift来实现一下
题目是这样的,如果给定的字符串是"the sky is blue",则应该返回"blue is sky the".整个的单词反转过来了,不只是所有的字符反转。
看到这道题,大家肯定都有很多种解法,我也有一种自己的做法。
1.首先反转所有的字符串
2.根据空格位一节,一个一节的反转就成功了。
可能这么说还是有点模糊,那话不多少,show you my code!
首先我们先定义一个交换的方法
func swapWords<T>(_ chars: inout [T], _ p: Int, _ q: Int) {
let temp = chars[p]
chars[p] = chars[q]
chars[q] = temp
}接着我们使用这个交换的方法来写一个完整的字符串反转的方法
//为什么我们这里已知字符串的长度还要给start和end 主要是用户后面分段反转
func reversWords<T>(_ chars: inout [T], _ start: Int, _ end: Int){
var begin = start
var finish = end
while begin < finish {
swapWords(&chars, begin, finish)
begin = begin + 1
finish = finish - 1
}
}
//这样我们就实现了第一步,反转一个完整的字符串 这个时候得到的是一个字符串数组 它的顺序是
eulb si yks eht既然我们已经完全反转的字符串,这个时候,我们需要趁热答题,接着反转
我们以空格为一个节点,到了空格,反转空格前的字符串
还有到了最后一个字符的时候,也要反转对应段的字符串
func Reverse(_ str: String?) -> String? {
guard let s = str else {
return nil
}
var chars = Array(s)
var start = 0
reversWords(&chars, 0, chars.count - 1)
for i in 0..<chars.count {
if i == chars.count - 1 || String(chars[i+1]) == " " { //这里要强转一下不然无法对比
reversWords(&chars, start, i)
start = i + 2 //i+2是空格后的下一位的位置
print("\(String(chars))----第\(i)次打印的结果")
}
}
return String(chars)
}
print(Reverse(s)!)duang,结果出来了

好了,到此结束。再见😁