При работе с векторами в программировании часто возникает необходимость выделить уникальные несмежные элементы. Эти элементы представляют собой отдельные значения вектора, которые не являются соседними друг с другом. В этой статье мы рассмотрим различные методы решения этой задачи на примерах кода на популярных языках программирования, таких как Python, C++ и Java.
Метод 1: использование набора (Python)
Python предоставляет удобную структуру данных, называемую набором, которая гарантирует уникальность ее элементов. Мы можем использовать это свойство для извлечения уникальных несмежных элементов из вектора.
def unique_nona(vector):
unique_elements = set(vector)
non_adjacent_elements = [elem for i, elem in enumerate(vector) if elem not in vector[i-1:i+2]]
return list(unique_elements.intersection(non_adjacent_elements))
Метод 2: итерация (Python)
Другой подход заключается в переборе вектора и проверке, отличается ли текущий элемент от соседних элементов. Если да, мы добавляем его в наш список результатов.
def unique_nona(vector):
non_adjacent_elements = []
for i in range(len(vector)):
if i > 0 and i < len(vector) - 1:
if vector[i] != vector[i-1] and vector[i] != vector[i+1]:
non_adjacent_elements.append(vector[i])
elif i == 0:
if vector[i] != vector[i+1]:
non_adjacent_elements.append(vector[i])
elif i == len(vector) - 1:
if vector[i] != vector[i-1]:
non_adjacent_elements.append(vector[i])
return non_adjacent_elements
Метод 3: битовая манипуляция (C++)
В C++ мы можем использовать побитовые операции для эффективного решения этой проблемы. Мы можем отслеживать наличие элемента с помощью битовой маски и проверять, установлены ли соседние биты.
#include <iostream>
#include <vector>
std::vector<int> unique_nona(std::vector<int>& vector) {
std::vector<int> non_adjacent_elements;
int bitmask = 0;
for (int i = 0; i < vector.size(); i++) {
if ((bitmask & (1 << vector[i])) == 0) {
non_adjacent_elements.push_back(vector[i]);
bitmask |= (1 << vector[i]);
}
}
return non_adjacent_elements;
}
Метод 4: Связанный список (Java)
В Java мы можем построить связанный список из уникальных несмежных элементов, перемещаясь по вектору и проверяя соседние узлы.
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
public class UniqueNona {
public List<Integer> uniqueNona(List<Integer> vector) {
List<Integer> nonAdjacentElements = new LinkedList<>();
Set<Integer> uniqueElements = new HashSet<>();
for (int i = 0; i < vector.size(); i++) {
if (!uniqueElements.contains(vector.get(i - 1))
&& !uniqueElements.contains(vector.get(i))
&& !uniqueElements.contains(vector.get(i + 1))) {
nonAdjacentElements.add(vector.get(i));
uniqueElements.add(vector.get(i));
}
}
return nonAdjacentElements;
}
}
В этой статье мы рассмотрели несколько методов извлечения уникальных несмежных элементов из вектора. Мы рассмотрели подходы с использованием множеств, итераций, манипуляций с битами и связанных списков в Python, C++ и Java. В зависимости от языка и конкретных требований вашего проекта вы можете выбрать наиболее подходящий метод для эффективного решения этой проблемы. Используя эти методы, вы сможете легко обрабатывать уникальные несмежные элементы в векторах.