Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 查找数组中一组数字的起点和终点_C++_Arrays_Algorithm_Search - Fatal编程技术网

C++ 查找数组中一组数字的起点和终点

C++ 查找数组中一组数字的起点和终点,c++,arrays,algorithm,search,C++,Arrays,Algorithm,Search,我有一个288个值的数组。它在一个组中以任意组合包含1和0 e、 g 它可以由一组零或一组一开始和结束。但可以保证数组中至少有一组0或1。我的兴趣是将一组索引的开始和结束存储在一个数组中。e、 g 6,16,23在第一个示例中是起始索引(假设这是要存储的向量),11,19是结束索引 我希望这是通用的。因为我的数组可以从任何组开始 我使用下面的代码来实现这一点,但是我没有成功地实现完整的逻辑。下面的代码是我写的一小部分,它只处理一种可能性 std::vector<float>start

我有一个288个值的数组。它在一个组中以任意组合包含1和0

e、 g

它可以由一组零或一组一开始和结束。但可以保证数组中至少有一组0或1。我的兴趣是将一组索引的开始和结束存储在一个数组中。e、 g 6,16,23在第一个示例中是起始索引(假设这是要存储的向量),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
        }
    }
}
std::vectorstart\u索引
std::vectorend_索引
浮点alter_值=数组[0];
对于(int i=0;i

也许我无法以更好的方式表达我想要的东西。但我希望您能理解。

您想存储索引,但却存储数组值。索引是整数,因此索引向量必须是
向量
,而不是

start_index.push_back(array[i+1])
你必须这样做

start_index.push_back(i+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);
        }
    }
std::向量开始索引
std::向量结束索引
对于(int i=0;i
最简单的方法:)

int last=array[0];
启动索引。将索引向后推(0);
对于(int i=1;i > p>你可以考虑下面的算法。它是在伪代码中——我不是C++风扇,但是重写它对任何语言都应该是微不足道的:

它循环遍历整个输入并检测组的边缘,将它们存储在结果*数组中

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);
 }
}
数组;//输入阵列
结果开始;//组开头的索引数组
结果;//组末尾的索引数组
searchFor=1;//群元素
inGroup=false;

对于(i=0;iyou提到的end_index.push_back(i-1);。它不应该是end_index.push_back(i);?@MT当您跳出循环时,
数组[i]等于0
,您需要记录最后一个
1
的位置,即
i-1
    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];
        }
    }   
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);
 }
}