仅替换彼此旁边的重复项

时间:2016-08-26 11:31:21

标签: arrays algorithm

如何仅在阵列中重复替换false副本,但不要触及分开的那些。

由此:

{false, false, false, false, true, true, false, true, false, false};

到此:

{false, true, true, false, true, false}

3 个答案:

答案 0 :(得分:1)

我认为智能方法如下。

boolean[] myArray = {false, false, false, false, true, true, false, true, false, false};

// Introduce myArray[0] to your array result.
for (int i = 1; i < myArray.length; i++) {
    if (myArray[i-1] || myArray[i]) // Introduce myArray[i] to your array result.
}

如果当前值为true,或者最后一个(由introduce变量控制)不是false,则引入该值。第一个元素总是被引入,因为它是真或假,逻辑问题就是引入它。

此外,如果您不短路myArray[i-1] || myArray[i]并让myArray[i-1] | myArray[i],我认为会更快。检查或操作的第二个值比在编译器级别创建 if指令以查看第一个值是否为真更快。

答案 1 :(得分:1)

您可以检查下一个元素,并仅在下一个false时移除当前false。同时您可以对同一个数组进行更改以删除重复项。

int index=0;
for(int i=0;i<arr.size()-1;i++)
{
   if(arr[i]==false && arr[i+1]==false)
      continue;
   else //this should exist in array
   {
      arr[index]=arr[i];
      index++;
   }
 }
 arr[index++]=arr[arr.size()-1];//for the last element
 //Last element added irrespective of being true or false
 //Now you can remove the elements from index to end
 std::remove(arr.begin()+index,arr.end());

答案 2 :(得分:1)

使用C ++和标准库:

v.erase(std::unique(v.begin(), v.end(),
                    [](bool a, bool b){ return !(a||b); }),
        v.end());

标准库std::unique函数通过覆盖除了第一个重复序列之外的所有内容来压缩集合。在这种情况下,我们使用lambda函数以避免将两个连续的true值计为重复值;只有一对值!(a||b)为真,并且该表达式仅在ab均为假时才为真。 (!a && !b也会起作用,很可能生成相同的代码。)

std::unique返回压缩范围的终点;然后必须(或至少有用)减小容器的大小,这是erase成员函数的作用,假设它是为容器v实现的(这里,我是假设vstd::vector,但std::dequestd::list也可以。)

Live on ideone