【问题标题】:How do I check that every element in an array is greater than the one before it?如何检查数组中的每个元素是否都大于它之前的元素?
【发布时间】:2017-05-29 09:04:00
【问题描述】:

我使用的是 Ruby 2.4。我有一个字符串数组,它们本身就是数字。所以像

["1", "2", "3", "5"]

如何检查数组中每个元素的整数版本(第一个元素除外)是否大于它之前的元素?因此,例如在上面执行的函数将返回 true,但是像

这样的数组
["1", "5", "4", "6"]

将返回 false(因为“4”不大于“5”。

【问题讨论】:

    标签: arrays ruby integer comparison


    【解决方案1】:

    表达谓词的另一种方式是:“对于所有 缺点有效的数字对,第二个是否大于 第一个“?这几乎可以直接用代码表示:

    ary.map(&:to_i).each_cons(2).all? {|first, second| second > first }
    

    顺便说一句:这个性质叫做“严格单调性”。

    【讨论】:

    • 我更喜欢这个,因为代码在做什么更明显。
    • 应该也快很多。
    • 谢谢,我忘了each_cons 代表什么。
    • @EricDuminil:是的,each_cons/each_slice 并不十分明显。
    【解决方案2】:

    可以使用Enumerable#sort_by查看arr是否已经按数值排序:

    arr = ["1", "2", "3", "5"]
    arr.uniq.sort_by(&:to_i) == arr
    #=> true 
    

    如果元素不是唯一的,那么数组会自动失败。因为这意味着两个元素具有相同的值,即一个不大于另一个。

    【讨论】:

    • 遗憾的是,我不能保证元素是唯一的,只能保证它们都是数字(伪装成字符串)。
    • @Natalia 如果它们按从低到高的顺序排列,它们必须满足您对“大于前一个”的定义,那么它就会被排序,因此排序应该没有效果。
    • 不过,你可以在 O(n) 内完成。
    猜你喜欢
    • 2022-01-25
    • 1970-01-01
    • 2020-10-13
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 2012-01-27
    • 2017-03-15
    • 1970-01-01
    相关资源
    最近更新 更多