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: " ")