作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有几个长度不一的列表,其中包含简单的正整数,例如 (2 4 1 3)
,我想检查列表排序后是否所有数字都在后面。这意味着顺序本身无关紧要,但不允许有间隙。
(2 4 1 3)
是正确的
(2 4 1 5)
不正确
在我开始重新发明轮子之前,我想知道是否有一种替代方法可以对列表进行排序,然后检查第一个和第二个(依此类推...)元素是否存在差异是 1
。
编辑
我的例子没有显示完整的任务。该列表不必每次都以 1
开头,即 (6 8 7 9)
也可以是有效输入。
最佳答案
您需要检查列表定义的集合是否与[a:b]
相同。这很容易通过创建 bit vector 来完成。适当的长度。这是列表长度的线性 (O(n)
)(需要扫描一次 length
和 min
,一次填充位向量),并且需要一些额外的向量临时内存:
(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))
),因此显然不是最优的。
关于list - 如何检查列表中的所有数字是否都在稳步增加?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54620566/
我是一名优秀的程序员,十分优秀!