2014-05-02 82 views
1

免费范围从一开始编辑我的问题,因为它是不够清楚:入门内的另一个范围

假设你有从1到1000

一系列考虑,在这个范围内的一些数字被保留(这是动态的)。

E.g. (i)

我想要在1..1000范围内获得一个5个数字的连续数字块,以确保这个数字块不包含任何保留的数字。如果这当然存在。

如果(i)是分配号码的列表,则第一个块是6,7,8,9,10。它不能是1,2,3,4,5,因为5是保留的。

我认为现在更清楚:)

我认为这应该是一个循环检查所有号码从1到995,并检查各号起始号码是否被保留 - 如果不是,检查如果4以下数字也保留。如果没有,我们有一个块。如果是,继续下一个未分配的号码,并检查后面的4位数字再次。当第一个空闲块满足时,打破循环并存储它!

+1

有点奇怪,你可以尝试改进解释并给出一些示例代码吗?至少一个算法。 – fedorqui

+2

考虑如何指定使用的数字 - 并在问题中说明。它们是按顺序指定的?是否有比N,M,O,... Z更经济的表示形式 - 简单数字列表?所使用值的压缩表示是否可以更容易地找到给定大小的间隙?你多久会这样做? (一次:使用什么算法或表示法并不重要,很多次:它开始很重要,尽管只有1000次蛮力的范围会让你走很长的路。) –

+0

一个免费的5个大小的块就足够了; )。所以答案只有一次。 – aprin

回答

1
#!/bin/sh 
rs=(5 45 670 350) 
for co in {1..1000} 
do 
    oa+=($co) 
    for ec in ${rs[*]} 
    do 
    let co==ec && unset oa 
    done 
    let ${#oa[*]}==5 && break 
done 
echo ${oa[*]} 
+0

你是男人。真棒。谢谢。 – aprin

相关问题