list - 如何检查列表中的所有数字是否都在稳步增加?

标签 list numbers common-lisp

我有几个长度不一的列表,其中包含简单的正整数,例如 (2 4 1 3),我想检查列表排序后是否所有数字都在后面。这意味着顺序本身无关紧要,但不允许有间隙。

(2 4 1 3) 是正确的

(2 4 1 5) 不正确

在我开始重新发明轮子之前,我想知道是否有一种替代方法可以对列表进行排序,然后检查第一个和第二个(依此类推...)元素是否存在差异是 1

编辑

我的例子没有显示完整的任务。该列表不必每次都以 1 开头,即 (6 8 7 9) 也可以是有效输入。

最佳答案

最优解

您需要检查列表定义的集合是否与[a:b]相同。 这很容易通过创建 bit vector 来完成。适当的长度。 这是列表长度的线性 (O(n))(需要扫描一次 lengthmin,一次填充位向量),并且需要一些额外的向量临时内存:

(defun range-p (list)
  "Check that the list is identical to a..b as a set."
  (multiple-value-bind (min len)
      (loop for obj in list for len upfrom 0
        unless (integerp obj) do (return-from range-p nil)
        minimize obj into min
        finally (return (values min len)))
    (loop
      ;; 0: not seen this index in list yet
      ;; 1: already seen this index in list
      with indicator = (make-array len :element-type 'bit :initial-element 0)
      for obj in list for pos = (- obj min) do
        (unless (< pos len)
          ;; obj out of range
          (return-from range-p nil))
        (if (zerop (aref indicator pos))
            ;; obj is being seen for the 1st time; record that
            (setf (aref indicator pos) 1)
            ;; duplicate obj
            (return-from range-p nil)))
    ;; all list elements are unique and in the right range;
    ;; injectivity + same cardinality for finite sets => surjectivity
    t))

测试:

(range-p '(2 4 1 3))
==> T
(range-p '(2 4 1 5))
==> NIL
(range-p '(-1 5 3 4 2 1 0))
==> T
(range-p '(-1 5 3 4 3 1 0))
==> NIL
(range-p '(2 4 1 a 5))
==> NIL

排序

排序是线性的 (O(n*log(n))),因此显然不是最优的。

附言

这可能与 Check consecutive numbers recursively using Lisp 有关.

关于list - 如何检查列表中的所有数字是否都在稳步增加?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54620566/

相关文章:

python - 修改范围之间的一组值

java - Java中从字符串中提取数字

c# - 如何在 C# 中将数组的一部分设置为随机值?

数字实例的 Java 负数

common-lisp - 如何使用外键也用作键来实现 View 类

python - 将字符串列表转换为python中的列表

python - 如何根据第一个值替换元组排序列表中的元组Python

python - 每次遇到某个字符 (,) 时都添加字符 (',') 吗? Python 2.7.3

list - 替换 Common Lisp 列表中的项目?

multithreading - Common Lisp 中的 Actor 模型是否有任何好的资源,以及关于 Actor 模型的一般文档?