Swift实现单词反转

469 阅读2分钟

最近看到一道算法题,觉得还是蛮有意思的,就尝试着用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,结果出来了


好了,到此结束。再见😁