Ios 在句子中倒装单词-Swift

Ios 在句子中倒装单词-Swift,ios,swift,string,Ios,Swift,String,如何执行句子中所有单词的反转 范例 let str = "Hello playground" 结果应该类似于“olleH dnuorgyalp” 以最小的复杂性。工作代码 import UIKit var str = "Hello playground" let result = str.split(separator: " ").map { String($0.reversed())}.joined(separator: " ") print(result) // olleH d

如何执行句子中所有单词的反转

范例

let str = "Hello playground"
结果应该类似于“olleH dnuorgyalp”

以最小的复杂性。

工作代码

 import UIKit

 var str = "Hello playground"

 let result = str.split(separator: " ").map { String($0.reversed())}.joined(separator: " ")
 print(result) // olleH dnuorgyalp

基于OPs答案,如果您想在输出上遵循英文大写规则:

var str = "Hello playground"

let result = str.split(separator: " ").enumerated().map {
    let reversed = String($0.1.reversed())
    return $0.0 == 0 ? reversed.capitalized : reversed.lowercased()
    }
    .joined(separator: " ")
print("Rerversing letters in each word = \"" + result + "\"") // Olleh dnuorgyalp

还请注意,多个空格会把这个问题搞砸,逗号、句点和其他单词/句子定界符也一样。

您可以使用
字符串
方法
枚举子字符串
使用
。byWords
选项并用反转的子字符串替换每个单词的子范围。请注意,这样标点符号将保持不变:


变异方法:

var str = "Hello, playground!!!"

str.enumerateSubstrings(in: str.startIndex..., options: .byWords) { _, range, _, _ in
    str.replaceSubrange(range, with: str[range].reversed())
}
print(str)  // "olleH, dnuorgyalp!!!"

非突变:

let str = "Hello, playground!!!"
var result = ""
str.enumerateSubstrings(in: str.startIndex..., options: .byWords) { string, range, enclosingRange, _ in
    result.append(contentsOf: string!.reversed())
    result.append(contentsOf: str[range.upperBound..<enclosingRange.upperBound])
}
print(result)  // "olleH, dnuorgyalp!!!"
让str=“你好,操场!!!” var result=“” str.EnumerateSubstring(in:str.startIndex…,options:。byWords){string,range,enclosuringrange,uuin result.append(contentsOf:string!.reversed())
append(contentsOf:str[range.upperBound..这里是典型的函数式编程方法(也由@Saranjith发布)

复杂性 首先让我们定义

  • n
    :输入字符串中的字符数

  • k
    :输入字符串中的字数(当然,请解释为什么你说的最小复杂度,是指最小时间复杂度吗?函数式编程风格简洁易懂,但分析时间复杂度可能很棘手,因为编译器会“暗中”进行大量优化回答得好,但我希望看到您对解决方案的时间复杂性的分析。分析得好。(投票)。性能比我第一眼看到的要好。您可能能够在3•O(n)上获得恒定乘数时间复杂度降低到1或2,通过手写循环遍历字符,但这并没有显著节省。@Duncac谢谢。我同意你关于常数乘数的评论。很抱歉,但我无法理解.map{$0.reversed()}如何是O(n),因为map基本上是for循环,这就是O(n)。在for循环的内部,有一个反函数,它是O(n)。基本上是一个嵌套的for循环,它会得到O(n^2)。如果我错了,请纠正我。有人能详细说明这个方法的复杂性吗?
    let str = "Hello, playground!!!"
    var result = ""
    str.enumerateSubstrings(in: str.startIndex..., options: .byWords) { string, range, enclosingRange, _ in
        result.append(contentsOf: string!.reversed())
        result.append(contentsOf: str[range.upperBound..<enclosingRange.upperBound])
    }
    print(result)  // "olleH, dnuorgyalp!!!"
    
    let result = str
        .components(separatedBy: " ")
        .map { $0.reversed() }
        .joined()
    
    O(m0) + O(m1) + ... + O(mk-1)
    
    O(m0) + O(m1) + ... + O(mk-1) <= O(n)
    
    let result = str
        .components(separatedBy: " ") // O(n)
        .map { $0.reversed() } // O(m0) + O(m1) + ... + O(mk-1) <= O(n)
        .joined() // O(k) <= O(n)
    
    let result = String(str.reversed())
        .components(separatedBy: .whitespaces)
        .reversed()
        .joined(separator: " ")