请参阅代码中的注释:
import Foundation
let someString = "1234567"
func reverse(_ str: String) -> String {
var str = str
var indexLeft = 0
var indexRight = str.count - 1
while indexLeft < indexRight {
let a = str[str.index(str.startIndex, offsetBy: indexLeft)]
let b = str[str.index(str.startIndex, offsetBy: indexRight)]
// ???: какой самый простой, лаконичный и правильный способ поменять символы a и b,
// находящиеся на позициях indexLeft и indexRight, местами в строке
//
// FIXME: я сделал вот так, но, уверен, есть способ элегантнее
//
str = String(str.prefix(indexLeft) + String(b) + str.suffix(from: str.index(str.startIndex, offsetBy: indexLeft + 1)))
str = String(str.prefix(indexRight) + String(a) + str.suffix(from: str.index(str.startIndex, offsetBy: indexRight + 1)))
//
//
//
indexLeft += 1
indexRight -= 1
}
return str
}
print(reverse(someString)) // 7654321
更新:不,String 的内置 .reversed() 方法对我不起作用(为什么不起作用?-因为这是 Leetcode 的挑战)。问题是不要逆转。问题完全涉及字符串操作的优化——不知何故,它们现在看起来太麻烦并且花费太长时间(例如,有时包含很长字符串的测试用例以超出时间限制结束)。
并且内置不起作用?
最短的解决方案。
最简洁的解决方案:
和用法:
也许你不想创建扩展,那么像这样:
如果纯粹按照算法,那么大概是这样的:
没有反向的解决方案:
如果您不超出对字符串的操作,那么恕我直言,这里唯一可以做的就是用 suffix() 替换 suffix(from:),从而摆脱两个 index(:offsetBy:) 调用。别的什么都想不起来了……