【问题标题】:Find start and end points of a group of numbers in an array查找数组中一组数字的起点和终点
【发布时间】:2014-02-19 08:28:45
【问题描述】:

我有一个包含 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
        }
    }
}

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

【问题讨论】:

    标签: c++ arrays algorithm search


    【解决方案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);
            }
        }
    

    【讨论】:

    • 你提到了 end_index.push_back(i - 1);。不应该是 end_index.push_back(i); 吗?
    • @MT 跳出循环时,array[i] is equal to 0,需要记录最后一个1的位置,即i - 1
    【解决方案2】:

    您想存储索引,但您存储的是数组值。索引是整数,所以你的索引向量必须是vector&lt;int&gt;,而不是

    start_index.push_back(array[i+1])
    

    你必须这样做

    start_index.push_back(i+1)
    

    【讨论】:

      【解决方案3】:

      最简单的方法:)

          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];
              }
          }   
      

      【讨论】:

        【解决方案4】:

        您可以考虑以下算法。它是伪代码 - 我不是 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);
         }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-06-10
          • 1970-01-01
          • 1970-01-01
          • 2018-02-01
          • 2015-03-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多