Swift字符串API的HackerRank替代方案

6
我正在通过完成 HackerRank 的测试样例来为编程面试做准备。如果你熟悉这个过程,你通常需要使用包含多行字符串的标准输入,并根据问题要求提取信息。我遇到了许多问题,其中他们会给你一行(作为 String),里面有用空格分隔的 n 个整数(例如:1 2 3 4 5)。为了解决这个问题,我需要从 String 中推导出一个 [Int] 类型的数组。我想出了这个巧妙的方法:
func extractIntegers(_ s: String) -> [Int] {
    let splits = s.characters.split { [" "].contains(String($0)) }
    return splits.map { Int(String($0).trimmingCharacters(in: .whitespaces))! }
}

我把代码写在我的 Playground 里,它表现得非常出色,我甚至运行了多个自己编造的测试用例,它们全部都以优异的成绩通过了……然后我把代码复制到 HackerRank 平台上进行提交尝试。结果我得到了以下信息:

solution.swift:16:29: error: value of type 'String' has no member 'trimmingCharacters'
return splits.map { Int(String($0).trimmingCharacters(in: .whitespaces))! }

嗯...好吧,也许人力资源部门还没有更新Swift 3的所有内容。没关系!我有一个更干净的解决方案的想法!以下是我的建议:

func extractIntegers(_ s: String) -> [Int] {
    return s.components(separatedBy: " ").map { Int($0)! }
}

当然,还有:

solution.swift:15:12: error: value of type 'String' has no member 'components'
return s.components(separatedBy: " ").map { Int($0)! }

现在我被迫使用一种非常笨拙的方法,循环遍历所有字符,检查空格,在空格之间附加子字符串到一个数组中,然后映射该数组并返回。

有没有其他更好的解决 HR 在 Swift 上不足的方法?我希望能得到任何可用的建议!

提前致谢!


很奇怪。我在 HR 上尝试了你的两个函数,都按预期工作。另外,你的问题中有很多与实际问题无关的文本,建议删除。 - Martin R
@MartinR - 真的吗,它们对你有用?是什么可能导致它对你有效而对我无效? - Pierce
2
你可能忘记了导入 Foundation - Martin R
1
@MartinR - 哇,感觉自己像个彻头彻尾的傻瓜。抱歉,我昨天才开始使用 HR,而且我居然没想到要导入框架!谢谢你!如果你想将此作为答案提交,我会非常愿意接受它。 - Pierce
1个回答

11

字符串方法String

func trimmingCharacters(in set: CharacterSet) -> String
func components(separatedBy separator: String) -> [String]

实际上是 NSString 类的方法,定义在 Foundation 框架中,并通过“桥接”到 Swift。因此,为了使您的代码编译通过,您需要添加

import Foundation

但是稍微简化一下你的第一种方法,就可以使用纯Swift进行编译,无需导入Foundation库。它可以处理前导、尾随和中间的空格:

func extractIntegers(_ s: String) -> [Int] {
    let splits = s.characters.split(separator: " ").map(String.init)
    return splits.map { Int($0)! }
}

let a = extractIntegers("  12   234   -567 4  ")
print(a) // [12, 234, -567, 4]

更新:针对Swift 4 进行了简化。

func extractIntegers(_ s: String) -> [Int] {
    return s.split(separator: " ").compactMap { Int($0) }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接