我有一个包含288个值的数组。它包含任意组合中的1和0。
例如
[0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0.1]
[1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0...]
[1,1,1,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1....]
它可以由一组零或一组一组开始和结束。但是保证在数组中它至少有一组零或一组。我的兴趣是在数组中存储一组的开始和结束的索引。例如,start_index中的第一个例子中的6,16,23(假设这是要存储的向量)和end_index中的11,19。
我希望这是通用的。因为我的数组可以从任何组开始。
我正在使用以下代码来实现这一点,但是我没有成功实现完整的逻辑。每当我认为我被困在如何制作算法时。下面的代码是我写的一小部分,只涉及一种可能性。
std::vector<float>start_index
std::vector<float>end_index
float alter_value = array[0];
for (int i = 0; i < array.size(); i++)
{
if (alter_value == 0)
{
if(array[i+1] != alter_value)
{
start_index.push_back(array[i+1]);
alter_value = array[i+1]; // this makes my alter_value = 1
}
}
}
可能我不可能以更好的方式传达我想要的东西。但我希望你明白。
答案 0 :(得分:1)
您希望存储索引,但是存储数组值。指数是整数,因此您的指数向量必须为vector<int>
,而不是
start_index.push_back(array[i+1])
你必须这样做
start_index.push_back(i+1)
答案 1 :(得分:1)
您可以在数组中查找1
,找到它后,记录其位置并跳过所有相邻的1。一旦你达到零,你可以继续做同样的事情(寻找下一个1
)。
编辑后的代码如下所示。还要注意声明中的一些变化。
std::vector<int> start_index
std::vector<end> end_index
for (int i = 0; i < array.size(); i++)
{
if (array[i] == 1)
{
start_index.push_back(i);
while(array[i] == 1 && i < array.size()) {
i++;
}
//will reach here if array[i] == 0 or array is exhausted
end_index.push_back(i - 1);
}
}
答案 2 :(得分:0)
最简单的方法:)
int last = array[0];
start_index.push_back(0);
for (int i = 1; i < array.size(); i++) {
if (array[i] != last) {
start_index.push_back(i);
last = array[i];
}
}
答案 3 :(得分:0)
您可以考虑以下算法。这是伪代码 - 我不是C ++的粉丝,但将其重写为任何语言应该是微不足道的:
它循环遍历整个输入并检测组的边缘,将它们存储在result *数组中。
array; // input array
resultStarts; // array of indexes of starts of groups
resultEnds; // array of indexes of ends of groups
searchFor = 1; // element of groups
inGroup = false;
for(i=0;i<length(array);i++) {
if((array[i] == searchFor) && ! inGroup) {
// it's start of group
inGroup = true; // mark it
push(resultStarts, i);
}
if(inGroup && ((array[i] != searchFor) || i == length(array))) {
// end of group (of the input)
inGroup = false;
push(resultEnds, i);
}
}