2016-08-26 7 views
1

Как сделать замену рядом друг с другом ТОЛЬКО false дублирует в массиве, но не прикасайтесь к тем, которые разделены.Замените ТОЛЬКО рядом друг с другом дубликаты

Отсюда:

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

к этому:

{false, true, true, false, true, false} 
+0

Общий подход: Проход 1: Извлечь подпоследовательности; Проход 2: построить результат из этих. Итерацию и сохранение начального индекса (начало маркировки ложной подпоследовательности), пока не получится true; добавьте пару (начало, конец) в некоторый список. Новый ввод-индекс введен, если наблюдается новое ложное значение. После этого вы получили список пар (стартового). Заполните новый массив результатов/массив с одним ложным значением для пары; добавьте истины исходного массива, между end_x, start_x_ + 1. Продолжить ... – sascha

+0

@sascha Можете ли вы привести пример, я лучше понимаю пример, чем слова ... – BladeMight

ответ

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. Первый элемент всегда вводится, потому что wether истинно или ложно, логическая проблема говорит о его внедрении.

Кроме того, я думаю, что это пойдет быстрее, если вы не закоротите myArray[i-1] || myArray[i] и не допустите myArray[i-1] | myArray[i]. Быстрее проверить второе значение или операцию, чем сделать , если инструкция на уровне компилятора, чтобы увидеть, является ли первое значение уже истинным.

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()); 
+0

Я думаю, что если последний элемент 'arr' является истинным, он не вводится в результат, когда он должен. Также, если два последних элемента являются true, false. Должно быть также введено последнее ложное. –

+0

@SantiGil Я думаю, что последний элемент всегда будет представлен в этом коде, который будет сортировать вещи. Если последний элемент верен, он будет введен.Если в конце есть два ложных, второе последнее ложное не будет введено, пока последний будет. –

+0

Хорошо! Я не видел 'arr [index ++] = arr [arr.size() - 1]' –

1

Используя C++ и стандартной библиотеки:

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

Стандартная библиотека std::unique функция сжимает коллекцию путем перезаписи всех, кроме первого из последовательности дубликатов. В этом случае мы используем лямбда-функцию, чтобы избежать подсчета двух последовательных значений true как дубликатов; только пара значений, такая что !(a||b) является истинным числом отсчетов, и это выражение истинно только в том случае, если оба значения a и b являются ложными. (!a && !b будет работать так же хорошо и, скорее всего, будет генерировать идентичный код.)

std::unique возвращает конечную точку сжатого диапазона; тогда необходимо (или, по крайней мере, полезно) уменьшить размер контейнера, что и делает функция-член erase, предполагая, что она реализована для контейнера v (здесь я предполагаю, что v является std::vector, но std::deque или std::list будет работать также).

Live on ideone

+0

выглядит сложным ... – BladeMight

+1

@BladeMight: Добавлены пробелы и пояснения. Это очень просто. – rici

+0

Ну теперь я понимаю, но это только для C++? – BladeMight

Смежные вопросы