用 Swift 重构解决方案

2023-12-06

我一直在通过 HackerRank 测试用例来学习编码考试,大部分情况下我都做得很好,但我对一些简单的案例很感兴趣,当我看不到解决方案时,你们都会帮助我。我正在解决这个问题:

https://www.hackerrank.com/challenges/ctci-ransom-note

一名绑匪写了一张勒索信,但担心会被追踪到他。他找到了一本杂志,想知道是否可以从其中剪下整个单词,并用它们来制作一份无法追踪的勒索信复制品。他的笔记中的单词区分大小写,他必须使用杂志中可用的整个单词,这意味着他不能使用子字符串或连接来创建他需要的单词。

给定杂志中的文字和勒索信中的文字,如果他可以使用杂志中的整个单词准确地复制勒索信,请打印“是”;否则,打印No。

输入格式

第一行包含两个以空格分隔的整数,分别描述(杂志中的字数)和(勒索字条中的字数)的值。 第二行包含空格分隔的字符串,表示杂志中出现的单词。 第三行包含空格分隔的字符串,表示勒索字条中出现的单词。

每个单词均由英文字母组成(即 to 和 to )。 便条和杂志中的文字区分大小写。 输出格式

打印“是”,如果他可以使用这本杂志制作一份无法追踪的勒索信复制品;否则,打印No。

输入样本

6 4
give me one grand today night
give one grand today

样本输出

Yes
Explanation

写一份无法追踪的赎金副本所需的所有四个字都出现在杂志中,因此我们打印“是”作为我们的答案。

这是我的解决方案:

import Foundation

func main() -> String {
    let v = readLine()!.components(separatedBy: " ").map{Int($0)!}
    var a = [String](); var b = [String]()
    if v[0] < v[1] { return "No"}
    for i in 0 ..< 2 {
        if i == 0 {
            a = (readLine()!).components(separatedBy: " ")
        } else { b = (readLine()!).components(separatedBy: " ") }
    }

    // Get list of elements that intersect in each array
    let filtered = Set(a).intersection(Set(b))
    // Map set to set of Boolean where true means set a has enough words to satisfy set b's needs
    let checkB = filtered.map{ word in reduceSet(b, word: word) <= reduceSet(a, word: word) }

    // If mapped set does not contain false, answer is Yes, else No
    return !checkB.contains(false) ? "Yes" : "No"
}
func reduceSet(_ a: [String], word: String) -> Int {
    return (a.reduce(0){ $0 + ($1 == word ? 1 : 0)})
}

print(main())

使用此解决方案,我在 20 个测试用例中的 3 个上总是超时。因此,该解决方案似乎解决了所有测试用例,但不在其所需的时间限制内。这些都是很好的练习,但是当你陷入这样的困境时,会非常令人沮丧。

我应该注意的是我使用SetsSet(a).intersection(Set(b))因为当我尝试映射数组时Strings,一半的测试用例超时。

任何更清洁或更有效的解决方案将不胜感激!谢谢你!


感谢@Alexander - 我能够使用解决这个问题NSCountedSet而不是我的习惯reduce方法。它更清洁、更高效。这是解决方案:

import Foundation

func main() -> String {
    let v = readLine()!.components(separatedBy: " ").map{Int($0)!}
    var a = [String](); var b = [String]()
    if v[0] < v[1] { return "No"}
    for i in 0 ..< 2 {
        if i == 0 {
            a = (readLine()!).components(separatedBy: " ")
        } else { b = (readLine()!).components(separatedBy: " ") }
    }
    let countA = NSCountedSet(array: a)
    let countB = NSCountedSet(array: b)
    let intersect = Set(a).intersection(Set(b))
    let check = intersect.map{ countB.count(for: $0) <= countA.count(for: $0) }
    return !check.contains(false) ? "Yes" : "No"
}
print(main())

非常感谢!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用 Swift 重构解决方案 的相关文章

  • 将值添加到数组的最有效方法

    假设我有一个大小为N where N gt 0 是否有一种更有效的方法可以不需要 O N 1 步骤来添加到数组中 在代码中 本质上 我目前正在做的是 function prependArray value oldArray var newA
  • 迭代 NSOrderedSet

    我正在尝试迭代 NSOrderedSet 的实例 像这样的事情 func myFunc var orderedSet NSOrderedSet array 42 43 44 for n in orderedSet NSLog i n 但是
  • PresentModalViewController 不执行任何操作

    我有一个 UIViewController parent 调用presentModalViewController与另一个 UIViewController child on viewDidLoad If parent没有 UINaviga
  • UISearchController 保留问题

    我正在尝试使用 UISearchController 但是我遇到了无法解决的保留问题 MainTableview 有两个部分 第1节 基于某些正则表达式过滤数据 第2节 All Data 我将 UISearchController 添加到我
  • Swift getnameinfo IPv6 结果不可靠

    我有以下扩展sockaddr extension sockaddr Indicates if this is an IPv4 address var isIPv4 Bool return sa family UInt8 AF INET In
  • Turbo C 阵列问题

    我只是想问一些关于我的代码的事情 define LIM 40 main int day 0 float temp LIM clrscr do printf Enter temperature for day d day scanf f te
  • 在 Go 中,如何将结构体转换为字节数组?

    我有一个我定义的结构实例 我想将其转换为字节数组 我尝试了 byte my struct 但这不起作用 另外 我还被指出二进制包 http golang org pkg encoding binary 但我不确定我应该使用哪个函数以及应该如
  • PrepareForSegue之谜

    我在两个不同的 VC 中有一个prepareForSegue 方法 一个使用一个if声明 而另一个旨在使用switch 除了名称之外 代码几乎相同 这个效果很好 void prepareForSegue UIStoryboardSegue
  • Objective C UIImagePNGRepresentation内存问题(使用ARC)

    我有一个基于 ARC 的应用程序 它从 Web 服务加载大约 2 000 个相当大 1 4MB 的 Base64 编码图像 它将 Base64 解码后的字符串转换为 png图像文件并将其保存到磁盘 这一切都是在一个循环中完成的 我不应该有任
  • 应用程序传输安全已禁用,但仍然出现 SSL 握手错误

    我在通过 HTTPS SSL 连接到 API 时遇到问题 我已经使用下面的字典完全禁用了应用程序传输安全性 ATS 尽管 SSL 证书通过了 NSCURL 的所有测试
  • 按范围迭代数组

    我有一个数组 1 2 3 4 5 6 100 我希望将此数组迭代 5 次 具体来说 取数组的前 5 个数字并获取平均值 继续处理接下来的 5 个数字并获取平均值 依此类推 我尝试过多种方法 例如Dequeue和 for 循环但未能获得所需的
  • 使用 json_encode() 函数在 PHP 数组中生成 JSON 键值对

    我正在尝试以特定语法获取 JSON 输出 这是我的代码 ss array 1 jpg 2 jpg dates array eu gt 59 99 us gt 39 99 array1 array name gt game1 publishe
  • 自定义 MKAnnotationView - 如何捕获触摸而不忽略标注?

    我有一个自定义 MKAnnotationView 子类 它完全按照我想要的方式显示视图 在那个视图中 我有一个按钮 我想捕获按钮上的事件来执行操作 这很好用 但是 我不希望标注被忽略或消失 基本上 触摸标注中的按钮将开始播放声音 但我想保留
  • iOS7 中“-webkit-overflow-scrolling: touch” 最初的屏幕外元素被破坏

    既然转基因种子已经发布了 我们现在可以谈谈了 看起来 iOS7 中的 webkit overflow scrolling touch 已损坏 最初不在屏幕上的元素的触摸事件不会触发 或者在某些情况下只是不可靠 这是一个例子
  • 在 UIView 中实现自定义 StaggereGrid,就像 SWIFT 中的 Etsy 应用程序一样

    我想实现一个像 Etsy 应用程序一样的 StaggeredGrid 但我对此一无所知 你能给我一些建议吗 这是我需要做的事情的屏幕截图 None
  • JavaScript 中数组的 HTML 数据列表值

    我有一个简单的程序 它必须从服务器上的文本文件中获取值 然后将数据列表填充为输入文本字段中的选择 为此 我想要采取的第一步是我想知道如何动态地将 JavaScript 数组用作数据列表选项 我的代码是
  • 如何将 UDF 中的结构或类数组返回到数据帧列值中?

    d ID 1 pID 1000 startTime 2018 07 02T03 34 20 endTime 2018 07 03T02 40 20 ID 1 pID 1000 startTime 2018 07 02T03 45 20 en
  • 将 2D NumPy 数组按元素相乘并求和

    我想知道是否有一种更快的方法 专用 NumPy 函数来执行 2D NumPy 数组的元素乘法 然后对所有元素求和 我目前使用np sum np multiply A B 其中 A B 是相同维度的 NumPy 数组m x n 您可以使用np
  • 在 UIMenuItem 上设置accessibilityLabel

    我正在尝试设置accessibilityLabel of a UIMenuItem而且似乎没有效果 无论如何 VoiceOver 只是读取项目的标题 let foo UIMenuItem title foo action selector
  • 为什么这个 SKPhysicsJointPin 不能将这 2 个精灵保持在一起?

    我显然不太了解 SKPhysicsJoint 但是除了 Apple 文档之外 网上的信息还很少 下面的代码有什么问题 我认为应该保持头部和颈部永久连接 我的意图是它们就像两张带有大头针的纸 这样它们可以旋转一点 但不仅仅是完全分开 当我运行

随机推荐