如何仅在阵列中重复替换false
副本,但不要触及分开的那些。
由此:
{false, false, false, false, true, true, false, true, false, false};
到此:
{false, true, true, false, true, false}
答案 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)
为真,并且该表达式仅在a
和b
均为假时才为真。 (!a && !b
也会起作用,很可能生成相同的代码。)
std::unique
返回压缩范围的终点;然后必须(或至少有用)减小容器的大小,这是erase
成员函数的作用,假设它是为容器v
实现的(这里,我是假设v
是std::vector
,但std::deque
或std::list
也可以。)