我正在尝试找到一个稍微更优雅的解决方案来查找数字序列是否有序。这是一个Web表单,我给用户一个编号项目的机会,这将设置订单。我知道最大数量的项目,它应始终从一开始。
现在(我知道这是不正确的)我测试以确保所有数字都不同并加起来它应该是什么(例如,我测试它的三个项目增加到6)。有没有人有更好/更准确(因为有可能破坏我的解决方案)?我正在使用php,但我真正想要的是逻辑,所以你的例子可能是伪代码或任何相对容易阅读的语言。
答案 0 :(得分:2)
只需对用户输入的数字进行排序,看看它们是否与您递增1的索引匹配。
nMax = 10
sortedUserArray = Sort(UserArray)
For i = 1 To nMax
If Not sortedUserArray(i) = i Then
' Input not valid.
' Throw an error or something.
End If
Next i
对于Sort
部分,存在多种排序算法:Quicksort,Straight insertion,Heapsort等。只需选择一个符合您需求的方法并执行搜索以在网上找到现成的程序。您选择的语言甚至可能有一些内置的排序算法,因此您甚至可能不需要看那么远。
答案 1 :(得分:2)
由于您知道最大项目数,因此可以通过简单地分配布尔数组并填充它来避免排序。在伪代码中:
define numsInOneThruN (int xarr[], int sz):
# Declare the boolean array and initialise to all false.
declare isSet[1..sz]
for all i in 1..sz:
isSet[i] = false
# For every number in list, if within range, set boolean value to true.
for all i in xarr:
if i >= 1 and i <= sz:
isSet[i] = true
# Check that all boolean values are true.
for all i in 1..sz:
if not isSet[i]:
return false
return true
这样做的好处是O(n)
时间复杂度而不是O(n log n)
的最佳情况 - 这对于小型数据集可能无关紧要,但对于较大的数据集可能会变得很重要。 / p>
您还应该考虑到这一事实,即它具有比就地排序更高的空间复杂度,因为它使用的数组与输入大小相等。这使得O(n)
空格而不是排序选项的O(1)
。
与往常一样,您可以根据需要在时间上进行权衡。
答案 2 :(得分:1)
如果您已经确定数字全部不同,只需检查最小值和最大值。只有n个不同的数字满足1&lt; = x&lt; = n。