如何对句子中的所有单词进行反转。
示例
let str = "Hello playground"
结果应该像"olleH dnuorgyalp"
复杂性最低。
答案 0 :(得分:2)
您可以使用String
方法enumerateSubstrings
使用.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!!!"
答案 1 :(得分:2)
这是典型的函数式编程方法(也由 @Saranjith 发布)
let result = str
.components(separatedBy: " ")
.map { $0.reversed() }
.joined()
首先让我们定义
n
:输入字符串中的字符数k
:输入字符串中的字数(当然k <= n)现在让我们看看每段代码的时间复杂度
.components(separatedBy:“”)
此说明需要遍历整个字符串O(n)
.map {$ 0.reversed()}
这里每个单词都是相反的。因此,如果我们有k
个单词,那么我们的时间复杂度为
O(m0) + O(m1) + ... + O(mk-1)
其中mi
是i-th
字的长度。
然而,所有单词的长度总和是&lt; = n所以我们可以说
O(m0) + O(m1) + ... + O(mk-1) <= O(n)
<强> .joined()强>
最后我们有k
个词需要加入到关键词中。这可以在O(k)
中完成,同样是<= 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)
时间复杂度= O(n)+ O(n)+ O(n)= O(n)
.components(separatedBy:“”)
我们正在构建k Strings (m0, m1, ..., mk-1)
。这些k-1
字词的长度总和为<= n
,因此空间复杂度为O(n)
。
.map {$ 0.reversed()}
对于每个(m0,m1,...,mk-1),我们正在构建一个副本。所以,再次O(n)
。
<强> .joined()强>
这里我们构建的结果是一个包含n个字符的字符串。因此空间复杂度为O(n)。
空间复杂度:O(n)+ O(n)+ O(n)= O(n)。
答案 2 :(得分:1)
工作代码!
import UIKit
var str = "Hello playground"
let result = str.split(separator: " ").map { String($0.reversed())}.joined(separator: " ")
print(result) // olleH dnuorgyalp
答案 3 :(得分:1)
根据OP的答案,如果你想在输出上遵循英语大小写规则:
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
另请注意,多个空格会混淆这一点,就像逗号,句号和其他单词/句子分隔符一样。
答案 4 :(得分:0)
url