我有一个文本字段,在其中无法设置升序/降序的文本。例如"abcdefgh"
或"1234567"
。如何快速识别输入的字符串不是按升序/降序排列。
答案 0 :(得分:2)
这应该可以解决问题:
enum Order {
case ascending
case descending
case none
}
func getOrder(of text: String) -> Order {
switch text {
case String(text.sorted()):
return .ascending
case String(text.sorted().reversed()):
return .descending
default:
return .none
}
}
答案 1 :(得分:2)
其他人建议对字符串进行排序,并检查数组是否随着排序而改变。这不太正确,因为字符串“ abcxyz”是按排序顺序排列的,但不是序列,因为它缺少一些字符。排序也相对昂贵,至少在较大的数组上是如此。 (如果要处理数百个字符,这不是问题,因为对于小数据集,好的排序算法的O(n•log n)
性能几乎是O(n)
性能。)
我想到的String扩展名如何?
extension String {
func isSequence() -> Bool
{
let charValues = Array(self.unicodeScalars).map { $0.value }
guard let first = charValues.first,
let last = charValues.last else { return false }
return charValues == Array(first...last)
}
}
它将字符串映射到UTF32值数组中,然后检查结果是否与值first...last
的范围相同。
您可以使用该功能来验证用户的文本输入,以查看其是否是诸如abcdefg之类的连续字符序列。
以上内容应具有O(n)
的时间复杂度。
答案 2 :(得分:1)
您可以这样操作:
func isOrderedSequence(_ string: String) -> Bool {
return string == String(string.sorted())
}
以下是一些测试用例:
isOrderedSequence("1234567") //true
isOrderedSequence("7836") //false
isOrderedSequence("abcdefg") //true
isOrderedSequence("Hello") //false
isOrderedSequence("123abc") //true
它使用sorted()