【问题标题】:Swift String API Alternate for HackerRankHackerRank 的 Swift 字符串 API 替代方案
【发布时间】:2017-01-17 19:11:20
【问题描述】:

所以我正在尝试通过做 HackerRank 的测试用例样本来为编码面试做好准备。如果您熟悉该过程,您通常会采用具有多行字符串的标准输入,然后根据问题的要求提取信息。我遇到过许多问题,他们会给你一行(String),其中n 整数个数用空格分隔(即1 2 3 4 5)。为了解决这个问题,我需要从String 中推断出Int ([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))! }

所以...好吧,也许 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 的不足之处?我想要任何我能得到的建议!

提前致谢!

【问题讨论】:

  • 这很奇怪。我在 HR 上尝试了您的两个功能,并且都按预期工作。 – 顺便说一句,你的问题中有很多与实际问题无关的文字,我建议删除。
  • @MartinR - 他们真的在为你工作吗?什么可能导致它对你有用,而不是我?
  • 你可能忘了import Foundation
  • @MartinR - 哇,我觉得自己像个白痴。不好意思,昨天刚开始用HR,居然没想到要导入框架!谢谢!如果您想提交它作为答案,我很乐意接受。

标签: ios arrays swift string


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-29
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    • 2015-07-11
    • 2018-11-04
    • 2014-01-22
    相关资源
    最近更新 更多