一段关于搜索数组内连续满足某条件的数字的代码

周末趁有空,把某个程序的一个小算法问题解决了。

问题

有一组无序数字(整形,int),如何找出至少连续3个小于等于12的数字出来?
例如:1,2,3,11,12,13,4,5,6,7,14,15,16,17,8,9,10,18,19,20
输出:1,2,3;4,5,6,7;8,9,10(这里的“;”仅作区别几组输出结果显示之用)

因为周五太累了,本想一个简单的问题,发在群上等人解决了明天直接copy来用,不曾想反应冷淡。。。。

周六和周日用了一些时间去解决这个问题,包括精简代码。

在此感谢群里一位10的师弟,这个代码一定程度上参考了他的思想:

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/**
*实现语言是java
*变量i是数组游标;
*变量start是"第一个"出现小于等于12的数字的数组下标,“第一个”是相对于前一个大于12的数字而言;
*d是存储数字的数组,在测试过程中我用0~20的数字模拟这个数组;
*list是ArrayList<Integer>,用来存放输出结果;
*/
for (int i = 0 , start = 0 ; i < d.length ; i++)//遍历数组
{
if (d[i] <= 12)//对大于12的数字跳过
{
if (i == 0 || d[i - 1] > 12)//当d[i]为第一个数或d[i]的前一个数大于12时,记录游标start为i
{
start = i;//将第一个小于等于12的数字的游标记录在start
}
if (i + 1 == d.length || d[i + 1] > 12)//如果数组游标到达数组末尾或d[i]的后一个数字大于12
{
if (i + 1 - start >= 3)//判断数组游标与start游标的差是否大于等于3(判断是否为连续3个小于等于12的数)
{
for (int k = start ; k < i + 1 ; k++)//将结果用list保存起来
{
list.add(d[k]);
}
list.add(";");//用分号区分不同组别的结果
}
}
}
}

感想:问题虽然很简单,但思考过程还是有点意思的。但我只知道这段代码在java里可运行,其他语言没测试过。

个人觉得这段代码的特别之处就在于第5行和第9行的或运算上,假如把第5行或第9行各自的或运算条件调换的话,估计就要出问题了。java的或运算是这样的:a || b,如果条件a为true,则不需要判断条件b是否为true;同样,a && b,如果条件a为false,也不需要判断条件b。(不知道其他语言是否也是这样定义)

当然,这个问题或许还可以用递归思想解决,但个人对递归思想没什么好感,也不熟,所以就没从这方面入手了。