Swift String API替代HackerRank

时间:2017-01-17 19:11:20

标签: ios arrays swift string

因此,我尝试通过HackerRank的测试用例样本为编码采访做好准备。如果您熟悉该过程,通常会采用具有各种字符串的标准输入,并根据问题的要求提取信息。我遇到过很多问题,他们会给你一行(String),其中n个整数用空格分隔(即1 2 3 4 5)。为了解决这个问题,我需要从Int推断[Int]String)数组。我想出了这个漂亮的方法:

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))! }

所以......好吧,HR还没有为Swift 3更新所有东西。没什么大不了!我有一个更清洁的解决方案的想法!这是:

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

.... AAAAANDDD当然:

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

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

有没有人有任何其他干净的想法来解决HR与Swift的不足之处?我想得到任何建议!

提前致谢!

1 个答案:

答案 0 :(得分:11)

String方法

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

实际上是基金会中定义的NSString类的方法 框架,并“桥接”到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) }
}