如何返回数组中可能存在的一组连续数字?

2023-12-02

如果我有一个已排序的数组,如何找到连续的数字?顺便说一句,这是为了确定扑克牌是否是顺子。数组中的重复项已被删除。我可以做到这一点,但这将是一种多行方法,我认为可能有一个使用可枚举方法的快速单行方法。

例如:

FindSequence([9,8,7,5,4]) = [9,8,7]
FindSequence([4,2,0]) = nil

在1.9.2中,一个神秘的切片之前方法已添加到 Enumerable 中。您可以利用它:

def find_sequences_desc(a)
  prev = a[0]
  a.slice_before { |cur|
    prev, prev2 = cur, prev  # one step further
    prev2 - 1 != prev        # two ago != one ago ? --> new slice
  }.to_a
end
# find_sequences_desc [9,8,7,4,4] #=> [[9, 8, 7], [4], [4]]
# find_sequences_desc [9,8,7,5,4] #=> [[9, 8, 7], [5, 4]]

def find_sequences_asc(a)
  prev = a[0]
  a.slice_before { |cur|
    prev, prev2 = cur, prev  # one step further
    prev2 + 1 != prev        # two ago != one ago ? --> new slice
  }.to_a
end
# find_sequences_asc [1,2,4,5,7] #=> [[1, 2], [4,5], [7]]
# find_sequences_asc [1,2,3,5,6] #=> [[1, 2, 3], [5, 6]]

您可以获得所需的语义

def find_longest_sequence(a)
  s = find_sequences_desc(a).max
  s unless s.size <= 1
end

Update

Ruby 2.2 添加了切片时间方法,大大简化了代码:

def find_sequences_desc(a)
  a.slice_when { |prev, cur|
    cur != prev - 1
  }.to_a
end
# find_sequences_desc [9,8,7,4,4] #=> [[9, 8, 7], [4], [4]]
# find_sequences_desc [9,8,7,5,4] #=> [[9, 8, 7], [5, 4]]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何返回数组中可能存在的一组连续数字? 的相关文章

随机推荐

  • 如何计算文本文件中包含多个空格字符的所有单词

    我正在尝试编写一个程序来计算 Pascal 文本文件中的所有单词 我希望它处理多个空格字符 但我不知道该怎么做 我尝试添加一个布尔函数 Space 来确定字符是否是空格 然后执行 while not eof file do begin re
  • 编写默认构造函数强制零初始化?

    这些是我的类定义 class Foo int ent public void printEnt const cout lt lt ent lt lt class Bar Foo foo public void printEnt const
  • ASP .NET:动态加载控件与 Visible = true

    推荐哪一款 让我解释一下我想要实现的目标 我有一个页面被许多用户使用 每个用户都有不同的角色 如管理员 操作员 普通用户 当客户端打开该页面时 我想显示一组取决于其角色的控件 按钮 管理员可以执行 x 和 y 但普通用户不允许执行这些操作
  • 将 Json 记录到 Shiny 服务器中的 STDOUT

    可以在 AWS 上配置 Docker 容器以发送出现在stdout发送到集中式日志服务 这是一个巧妙的技巧 如果您将适当的 JSON 打印到标准输出 那么您可以自动化日志记录管道的大部分 而不必担心文件 我很乐意与它合作shiny serv
  • BigQuery Data Studio 自定义查询

    我正在尝试将 BigQuery 中的自定义查询与 Data Studio 连接起来 我已经阅读了这里的指南 但我还有几个问题 我的查询应该提取最近 7 天的漏斗流数据 因此在 Data Studio 中使用自定义查询时 如果可能的话 如何编
  • Google Play 游戏服务邀请丢失

    我正在使用新的 Google Play 游戏服务在 Android 上开发我的游戏 现在我正在尝试包含邀请系统 我有 3 个 Google 帐户 用于通过 2 个 Android 设备和 1 个 Android 模拟器尝试邀请 我的问题是
  • 函数超时 (jQuery)

    function getNames some code 这个功能可以在一秒钟内完成 但有时它会无限期地冻结自身和页面上的 html 块 ajax 内部 我希望这个功能有时间限制 如果十秒内没有完成 则中止它 这个怎么做 使用 jQuery
  • 使用 javascript toDataURL 保存 HTML5 画布时如何插入 PNG 注释块?

    我有一个紧凑的canvas to png下载保护程序功能 参见下面的代码 这段代码运行得很好 我对它的输出很满意 主要是 第二次更换就够了吗 那个替代品会是什么样子 我唯一的其他选择是使用 imagemagick 对文件进行后处理 有任何想
  • SFENCE和LFENCE对相邻核心的缓存有什么影响?

    From the speech Herb Sutter in the figure of the slides on page 2 这里显示了单独的缓存 L1S和存储缓冲区 SB 1 在 Intel x86 处理器中cache L1 和 S
  • 传递变量时 SwiftUI 中的 .sheet 行为奇怪

    我在 SwiftUI 中使用 sheet 视图 并且在代码执行中观察到奇怪的行为 我正在查看 SignInView2 struct SignInView2 View Environment presentationMode var pres
  • 使用 AJAX 将数据从 HTML 表单提交到 WebMethod

    因此 我从 HTML 表单中获取数据 然后使用 AJAX 将数据发送到 Web 方法 然后发送到 sqlite 数据库 但我的 AJAX 调用失败 我搞砸了什么 我做得正确吗 HTML 表单
  • 相当于 Access 中的 SET IDENTITY_INSERT OFF

    正如标题所示 是否有任何方法可以关闭 Access 中的自动编号字段 以允许我插入具有我选择的 id 的行 就像在 SQL Server 中使用 SET IDENTITY INSERT OFF 所做的那样 您可以使用 SQL 插入 ID I
  • Laravel 5.5 中用户会话过期时自动重定向

    我想使用 Laravel 函数在用户会话过期时自动重定向到我的登录页面 当用户尝试访问另一个页面并且会话过期时 我会进行重定向 我设置了一个生命周期 这有助于由于用户不活动而自动注销 而我想要的是在会话超时时立即重定向 我尝试使用 Java
  • mysql数据库中的奇怪字符

    当我输入像 或 这样的奇怪字符并将其存储在 mysql 数据库中时 该字符将被转换为 它可能必须对我的字符集做一些事情 但我现在不知道从哪里开始 在页面顶部我插入了 该字段在dbase中的搭配是 utf8 unicode ci 在网页中显示
  • Android studio 在 KMP/KMM/KN 中添加了错误的 xcodeproj 位置

    我正在尝试运行全新的 KMM 应用程序和我之前创建的现有 KMM 应用程序 当我尝试从 Android Studio 运行 iOS 版本时 我没有 iOS 配置 当我创建 iOS 配置时 我收到一个必须首先修复的错误 当我按下 修复它 按钮
  • 检查 PHP 类中的会话变量

    在我的索引页面顶部 使用以下命令设置会话 SESSION language english 当我回显 SESSION language 时 它回显 english 但是会话值在 PHP 类中不可读 为什么呢 你必须打电话session st
  • iOS 7 用 UIPickerView 打开 UITableViewController 很慢

    据此这个问题和 KyleC 的友善回答我已经实现了UITableViewController其中有许多行依赖于从核心数据中获取 每行显示一个简单的NSString 获取的对象的名称 并且有一个UIPickerView hidden 问题是
  • cin 条件检查错误

    我是一名学习c 的初学者程序员 我在使用 cin 命令时遇到了一个棘手的问题 在下面的程序部分中 如果我在第一个 cin 命令处输入错误的类型 则程序将根本不会执行以下任何 cin 命令 但会执行程序的其余部分 start include
  • CSS:顶部与顶部边缘

    我不确定我是否完全理解这两者之间的区别 有人可以解释为什么我会使用其中一种而不是另一种以及它们有何不同吗 如果您想将一个 块 元素从文档流中的其他元素移开 您可以使用边距 这意味着它将把以下元素推开 进一步向下 请注意 相邻块元素的垂直边距
  • 如何返回数组中可能存在的一组连续数字?

    如果我有一个已排序的数组 如何找到连续的数字 顺便说一句 这是为了确定扑克牌是否是顺子 数组中的重复项已被删除 我可以做到这一点 但这将是一种多行方法 我认为可能有一个使用可枚举方法的快速单行方法 例如 FindSequence 9 8 7