Google面试题目:
给出一个字符串,要求将其按照单词顺序进行反转
例如:原字符串:"the sky is blue"
反转后的字符串:"blue is the sky"
需要注意的点:
1)每个单词的长度不一
2)空格需要特殊处理
思路:
1)先整体将字符串反转 即 "the sky is blue"-->"eulb si yks eht"
2)每个单词作为一个字符串单独反转 即 "eulb si yks eht"-->"blue is the sky"
时间复杂度:O(n)
具体实现:
//字符串反转
fileprivate func _reverse<T>(_ chars: inout [T], _ start: Int, _ end: Int){
var start = start, end = end
while start < end {
swap(&chars, start, end)
start += 1
end -= 1
}
}
//字符交换
fileprivate func swap<T>(_ chars: inout [T], _ p: Int, _ q: Int){
(chars[p], chars[q]) = (chars[q], chars[p])
}
//功能实现
func reverseWords(s : String?)->String?{
//判断传入的字符是否为空,是则返回nil
guard let s = s else{
return nil
}
var chars = Array(s.characters), start = 0
//反转整个字符串
_reverse(&chars, 0, chars.count-1)
//每个单词单独反转
for i in 0..<chars.count{
//如果i为最后一个字符或者为空格,则反转前面这个单词
if (i == chars.count-1) || (String(chars[i+1]) == " " ){
_reverse(&chars, start, i)
start = i + 2
}
}
return String(chars)
}