79. Удалить повторения символов из списка, начиная с 3-го повторения
Условие задачи:
📌 Написать метод, в который передаётся список char. Необходимо удалить из списка все повторения символов, начиная с 3-го появления каждого символа.
То есть:
1-е и 2-е появление символа нужно оставить
3-е и все последующие появления этого же символа нужно удалить
Код:
public void removeDuplicatesFromThird(List<Character> chars) {
// TODO
}
📌 Пример 1:
Вход:chars = [a, b, a, a, c, b, b]
Выход:[a, b, a, c, b]
📌 Пример 2:
Вход:chars = [x, x, x, x]
Выход:[x, x]
📌 Пример 3:
Вход:chars = [m, n, o]
Спойлеры к решению
Подсказки
💡 Нужно считать, сколько раз каждый символ уже встретился.
💡 Удобно использовать
💡 Так как удаление идёт из списка, безопаснее проходить по нему через
💡 Если символ встретился 3-й раз или больше, его нужно удалить.
💡 Удобно использовать
Map<Character, Integer> для подсчёта.💡 Так как удаление идёт из списка, безопаснее проходить по нему через
Iterator.💡 Если символ встретился 3-й раз или больше, его нужно удалить.
Решение
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
public void removeDuplicatesFromThird(List<Character> chars) {
Map<Character, Integer> counts = new HashMap<>();
Iterator<Character> iterator = chars.iterator();
while (iterator.hasNext()) {
Character ch = iterator.next();
int newCount = counts.getOrDefault(ch, 0) + 1;
counts.put(ch, newCount);
if (newCount >= 3) {
iterator.remove();
}
}
}
Нужно пройти по списку, считать количество появлений каждого символа и удалять элемент, если он встретился 3-й раз или больше. Для удаления во время обхода лучше использовать
Iterator.