如何求解一个数组里面特定的值?还要考虑它的容错性!
怎么求解一个数组里面特定的值?还要考虑它的容错性!!
如题:::
我现在有这样一组数组,里面的值是这样的: 1 3 2 9 4 6 9 8 9 7 5 6 9 1 4 2 5 1 6 2一共20个数。我要把连续的大于等于5的值的个数求出来,在这例子中应该是是 6 9 8 9 7 5 6 9,但是我们观察到前面有一个9,4这两个数,中间夹着4这个数,虽然比5小,但是如果比5小的个数不超过2个,我们还是认为它跟后面一大串大于等于5是连续的。就像我们这个例子,实际连续大于等于5的应该是9 4 6 9 8 9 7 5 6 9到这个地方,而后面则不符合条件。。。。这就是我所谓的容错性。
请问有什么思路可以解决这样的问题。。用C++怎么实现这样的算法!!!
------解决方案--------------------
如果有两个符合要求的串,是要取长度更长的那个吗?按照你题目的要求,一个数字串里很可能存在多个符合要求的。
基本算法思路是:
1、找到第一个大于5的位置iStart,使用计数iDis统计后面跟着的比5小的个数,初始化为0.
2、判断下一个是否大于5,如果是则长度iNumLen+1;如果不是则距离iDis+1,判断iDis是否大于2,如果是则iLen=iLen-iDis,然后根据iStart和iLen把符合要求的字符串取出来,如果小于等于2,则度iNumLen+1,继续判断下一个。
3、如果找到多个符合要求的数字串,需要一个临时数组来保存上一个结果,如果当前找到的数字串比上一个长,则替换。
4、把最终的临时数组作为结果输出。
------解决方案--------------------
1归一化,将大于等于5的设置为1,将小于5的设置为0;if(data[i] >= 5 )
1 3 2 9 4 6 9 8 9 7 5 6 9 1 4 2 5 1 6 2 =》
0 0 0 1 0 1 1 1 1 1 1 1 1 0 0 0 1 0 1 0
2 对于值为1的保持不变,对于值为0的,则由它的左右两边的值的&&运算来确定。首尾位不变。
0 0 0 1 0 1 1 1 1 1 1 1 1 0 0 0 1 0 1 0=>
0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 1 1 1 0
3将上述结果为1的转换成原来对应的data值。
int tempData[20]={0};
for(int i=0;i<20;i++)
{
if(data[i] >= 5 )
{
tempData[i]=1;
}
}
for(int i=1;i<19;i++)
{
if(tempData[i] == 0)
{
tempData[i]=tempData[i-1] && tempData[i+1];
}
}
for(int i=1;i<19;i++)
{
if(tempData[i] == 1)
{
//这个i就是转化后保留的下标
}
}
------解决方案--------------------
如题:::
我现在有这样一组数组,里面的值是这样的: 1 3 2 9 4 6 9 8 9 7 5 6 9 1 4 2 5 1 6 2一共20个数。我要把连续的大于等于5的值的个数求出来,在这例子中应该是是 6 9 8 9 7 5 6 9,但是我们观察到前面有一个9,4这两个数,中间夹着4这个数,虽然比5小,但是如果比5小的个数不超过2个,我们还是认为它跟后面一大串大于等于5是连续的。就像我们这个例子,实际连续大于等于5的应该是9 4 6 9 8 9 7 5 6 9到这个地方,而后面则不符合条件。。。。这就是我所谓的容错性。
请问有什么思路可以解决这样的问题。。用C++怎么实现这样的算法!!!
------解决方案--------------------
如果有两个符合要求的串,是要取长度更长的那个吗?按照你题目的要求,一个数字串里很可能存在多个符合要求的。
基本算法思路是:
1、找到第一个大于5的位置iStart,使用计数iDis统计后面跟着的比5小的个数,初始化为0.
2、判断下一个是否大于5,如果是则长度iNumLen+1;如果不是则距离iDis+1,判断iDis是否大于2,如果是则iLen=iLen-iDis,然后根据iStart和iLen把符合要求的字符串取出来,如果小于等于2,则度iNumLen+1,继续判断下一个。
3、如果找到多个符合要求的数字串,需要一个临时数组来保存上一个结果,如果当前找到的数字串比上一个长,则替换。
4、把最终的临时数组作为结果输出。
------解决方案--------------------
1归一化,将大于等于5的设置为1,将小于5的设置为0;if(data[i] >= 5 )
1 3 2 9 4 6 9 8 9 7 5 6 9 1 4 2 5 1 6 2 =》
0 0 0 1 0 1 1 1 1 1 1 1 1 0 0 0 1 0 1 0
2 对于值为1的保持不变,对于值为0的,则由它的左右两边的值的&&运算来确定。首尾位不变。
0 0 0 1 0 1 1 1 1 1 1 1 1 0 0 0 1 0 1 0=>
0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 1 1 1 0
3将上述结果为1的转换成原来对应的data值。
int tempData[20]={0};
for(int i=0;i<20;i++)
{
if(data[i] >= 5 )
{
tempData[i]=1;
}
}
for(int i=1;i<19;i++)
{
if(tempData[i] == 0)
{
tempData[i]=tempData[i-1] && tempData[i+1];
}
}
for(int i=1;i<19;i++)
{
if(tempData[i] == 1)
{
//这个i就是转化后保留的下标
}
}
------解决方案--------------------