Как удалить все повторяющиеся символы в Word
Обновлено: 21.11.2024
В этом руководстве вы научитесь удалять все дубликаты из заданной строки в Python. Строки в Python — это последовательность символов, заключенная в одинарные, двойные или тройные кавычки. Для данной строки мы должны удалить все символы, которые встречаются в строке более одного раза. Мы будем следить за порядком появления персонажей. Например,
Ввод: "stringis"
Вывод: "строка"
Для решения этой проблемы существует несколько различных подходов,
- с использованием функций OrderedDict() и fromkeys()
- используя функцию OrderedDict() и метод set
Мы рассмотрим эти подходы отдельно
Подход 1: использование функции OrderedDict()
В этом подходе мы будем использовать метод OrderedDict() из класса collections и fromkeys() в нашей программе.
OrderedDict — это подкласс словаря, который запоминает порядок ключей, которые были вставлены первыми. Поскольку повторяющихся ключей быть не может, этот метод вернет строку после удаления повторяющихся символов.
Алгоритм
Следуйте алгоритму, чтобы лучше понять подход:
Шаг 1. Импорт OrderedDict из класса коллекций
Шаг 2. Определите функцию, которая будет удалять дубликаты
Шаг 3. Объявите строку с символами
Шаг 4. Вызов функции для удаления символов из этой строки
Шаг 5. Распечатайте значение, возвращаемое функцией
Программа Python 1
Посмотрите на программу, чтобы понять реализацию вышеупомянутого подхода.
abcfgbsca
После удаления дубликатов: abcfgs
Подход 2: OrderedDict
В этом подходе мы преобразуем строку в набор с помощью метода set(). Затем мы объявим другую строку и сохраним символы, которых еще нет в строке. Эта новая строка будет содержать результирующую строку.
Алгоритм
Следуйте алгоритму, чтобы лучше понять подход
Шаг 1. Импорт OrderedDict из класса коллекций
Шаг 2. Определите функцию, которая будет удалять дубликаты
Шаг 3. Создайте набор строк и сохраните
Шаг 4. Объявите новую пустую строку
Шаг 5. Запустите цикл и добавьте каждый символ в пустую строку, если он еще не присутствует в строке
Шаг 6. Распечатайте строку
Программа Python 2
Посмотрите на программу, чтобы понять реализацию вышеупомянутого подхода.
stdsrdthw
После удаления: stdrhw
Заключение
В этом руководстве мы обсудили два подхода к удалению дубликатов из строки. Мы также обсудили, как использовать методы класса коллекции и использовать их для удаления дубликатов.
Стив хранит адреса электронной почты в документе Word. Чтобы найти и удалить повторяющиеся адреса, он должен перенести адреса в книгу Excel. Стив интересуется, есть ли способ удалить дубликаты в Word.
Для целей этого совета я предполагаю, что каждый адрес электронной почты находится в отдельном абзаце, а это означает, что в конце отдельных адресов есть жесткий возврат. Кроме того, адреса указаны в обычном тексте, а не в таблице.
Имея это в виду, следующий макрос может оказаться очень полезным. Он использует два For. Next циклически перемещается по отдельным абзацам документа в обратном направлении. При обнаружении повторяющегося абзаца дубликат удаляется. Макрос не требует сортировки адресов электронной почты.
Обратите внимание, что два абзаца должны быть абсолютно одинаковыми. Если, например, один абзац имеет лишний пробел в начале или в конце, или у одного из них разные заглавные буквы, то они не будут считаться одинаковыми, и один не будет удален. Макрос также работает со всеми абзацами документа, а не только с их частью.
Если вы предпочитаете вариант, который работает только с выделенным текстом, вам подойдет следующее:
Чтобы использовать макрос, просто выберите нужные абзацы и запустите его. Ничто за пределами выбранных вами абзацев не будет изменено.
Сначала я предоставил возможные решения на основе макросов, исходя из того, что удаление дубликатов необходимо выполнять регулярно или в нескольких файлах. По правде говоря, вам не нужно использовать макрос. Вы можете использовать подход, основанный на подстановочных знаках возможностей поиска и замены Word. Выполните следующие действия:
- Отсортируйте абзацы, содержащие адреса электронной почты.
- Нажмите Ctrl+H, чтобы отобразить вкладку "Заменить" диалогового окна "Найти и заменить".
- Нажмите кнопку "Еще", если она доступна.
- Убедитесь, что установлен флажок "Использовать подстановочные знаки".
- В поле "Найти" введите "(*^13)@" (без кавычек).
- В поле "Заменить на" введите "\1" (опять же, без кавычек).
- Нажмите "Заменить все".
- Закройте диалоговое окно «Найти и заменить».
Это работает благодаря способу настройки шаблона в поле «Найти что» (шаг 5). Первая часть в скобках находит все (звездочка), оканчивающееся жестким возвратом (^13). Вторая часть — это знак @, что означает «найти одно или несколько вхождений упущенного». Таким образом, он находит повторяющиеся абзацы, идущие один за другим. (Вот почему необходим первый шаг, сортировка адресов электронной почты.) Затем они заменяются тем, что было в скобках на шаге 5.
Это может помочь немного лучше объяснить, что происходит. Допустим, после сортировки ваш список адресов электронной почты выглядит так:
Обратите внимание, что я добавил здесь начальные числа только для облегчения объяснения; они не входят в список адресов электронной почты.
Шаблон «Найти что» (*^13)@ будет соответствовать абзацам 2–4, потому что абзац 2, который соответствует части шаблона в скобках, повторяется еще два раза в строках 3 и 4. (Помните, что Символ @ соответствует «одному или нескольким вхождениям вышеизложенного».) Это совпадение из трех абзацев затем заменяется тем, что изначально соответствовало части *^13 шаблона «Найти что», что означает содержимое строки 2. Таким образом, эффект заключается в том, что абзацы 2–4 заменяются абзацем 2, а дубликаты удаляются.
Если вы хотите узнать, как использовать макросы, описанные на этой странице (или на любой другой странице сайтов WordTips), я подготовил специальную страницу, содержащую полезную информацию. Нажмите здесь, чтобы открыть эту специальную страницу в новой вкладке браузера.
Советы по Word — ваш источник недорогого обучения работе с Microsoft Word. (Microsoft Word — самое популярное программное обеспечение для обработки текстов в мире.) Этот совет (13842) относится к Microsoft Word 2007, 2010, 2013, 2016, 2019 и Word в Office 365.
Биография автора
На его счету более 50 научно-популярных книг и множество журнальных статей. Аллен Уайатт является всемирно признанным автором. Он является президентом Sharon Parq Associates, компании, предоставляющей компьютерные и издательские услуги. Узнайте больше об Аллене.
Привет всем, как дела? Прошло много времени с тех пор, как я поделился проблемой кодирования из интервью. Последнее, что я обсуждал, касалось нахождения N-го числа Фибоначчи, одной из популярных задач динамического программирования. Неважно, сегодня вы узнаете об еще одной популярной проблеме кодирования. Как удалить повторяющиеся или повторяющиеся символы из String в Java — это одна из часто задаваемых проблем кодирования на основе строк от Interviews. Эта проблема очень похожа на удаление повторяющихся элементов из массива, которое мы уже обсуждали здесь в прошлом, ведь String — это массив символов в Java. Если вы знаете, как решить эту проблему, вы сможете решить и эту.
Есть три основных способа удаления повторяющихся символов из строки в Java; Сначала отсортировать массив символов строки, а затем удалить повторяющиеся символы за линейное время.
Во-вторых, используйте вспомогательную структуру данных, например набор, для отслеживания уже просмотренных символов, а затем воссоздайте строку из набора. Это приведет к компромиссу между пространством и временем, поскольку пространственная сложность этого решения будет O(n).
Третий подход заключается в том, чтобы брать по одной строке методом грубой силы, а затем удалять все остальные вхождения этой строки, переупорядочивать массив и затем начинать со следующего элемента.
Это было бы ужасным решением из-за необходимости нескольких циклов.
Кстати, чтобы хотя бы подумать об этих решениях, вам нужно хорошо знать различные структуры данных и алгоритмы, которые являются фундаментальными частями решения проблем в мире программирования.
И если вы чувствуете, что вам не хватает навыков работы со структурой данных и алгоритмами, вы можете пересмотреть их, присоединившись к курсу «Структуры данных и алгоритмы: глубокое погружение с использованием Java», который является одним из лучших для изучения DS и алгоритмов в Java.
Как удалить повторяющиеся символы из заданной строки в Java
Теперь, когда вы знакомы с обеими проблемами и некоторыми подходами к удалению повторяющихся символов из заданной строки в Java, давайте углубимся в решения этой классической проблемы кодирования и проанализируем их временную и пространственную сложность.
Решение 1. Сортировка и удаление дубликатов
Если вы обратите немного внимания, то легко обнаружите, что удаление повторяющихся символов из строки — это не что иное, как удаление дубликатов из массива. Это означает, что вы можете использовать все способы, которые мы использовали ранее.
Если мы получим массив символов из String, а затем отсортируем его с помощью MergeSort или QuickSort за время O(N log N), мы сможем легко удалить дубликаты за линейное время, потому что они будут сгруппированы вместе. Все, что вам нужно сделать, это перебрать отсортированный массив символов, сравнить текущий элемент с предыдущим и отбросить его, если они совпадают.
В конце итерации ваш массив будет содержать только уникальные символы.Хотя у этого решения есть недостаток, оно не сохраняет первоначальный порядок элементов.
Поэтому, если интервьюер попросит вас сохранить элементы в их первоначальном порядке, это решение будет неэффективным, но с практической точки зрения это сработает, потому что вы имеете дело с повторяющимися символами. Если вы хотите узнать больше об алгоритмах стабильной сортировки, я предлагаю вам ознакомиться с курсами «Алгоритмы и структуры данных — части 1 и 2» на Pluralsight.
Решение 2. Использование структуры данных, такой как Set
Следующее решение — изящное и демонстрирует, как можно упростить алгоритм, выбрав подходящую структуру данных. Чтобы удалить повторяющиеся символы из String, нам нужна структура данных, в которой вставка и поиск будут очень быстрыми.
Если вы возьмете хеш-таблицу, мы получим O(1) для операций вставки и поиска. Кстати, если вы используете Java, у вас есть лучший выбор — HashSet , который представляет собой комбинацию набора данных и структуры данных хеш-таблицы.
Структура данных Set не допускает дублирования символов, поэтому, если вы преобразуете свою строку в массив символов, прокрутите ее, добавите каждый элемент в HashSet, вы получите Set без повторяющихся символов я>. Затем вы можете преобразовать этот набор в строку.
Наше решение основано на этом знании, но оно становится более элегантным при использовании StringBuffer для создания выходных данных. Метод String.add() для Set возвращает false, если элемент уже существует в Set, и с помощью этого мы можем создать StringBuilder только с уникальные символы.
Преобразование StringBuilder в String — тривиальная задача в Java, но если вы не знакомы с основными Java API, я предлагаю вам присоединиться к Полному мастер-классу по Java Тима Бучалаки на Udemy, одном из самых полных и актуальных онлайн-курсы по изучению Java.
Программа Java для удаления повторяющихся символов из строки
Теперь, когда вы поняли оба решения по удалению повторяющихся символов из строки, давайте напишем код для их реализации. В этой программе у меня есть два метода удаления дубликатов: один использует HashSet, дополнительную структуру данных, а другой удаляет повторяющиеся символы на месте без использования какой-либо другой структуры данных или дополнительной памяти.
Я сделал программу интерактивной, чтобы вы могли играть с ней. Когда вы запускаете эту программу в Eclipse IDE или из окна командной строки, она попросит вас ввести строку, а затем выведет строку без повторяющихся символов в консоль.
Таким образом, вы можете тестировать решение и код с различными входными данными, такими как пустая строка, пустая строка, строка без дубликатов, строка с дубликатами, строка, содержащая только дубликаты, а также с очень короткими или длинными входными строками.
Кстати, если вы изо всех сил пытаетесь преобразовать решения в код или просто пытаетесь найти решения проблем с кодированием, я настоятельно рекомендую вам присоединиться к интерактивному курсу Grokking the Coding Interview: Patterns for Coding Questions от Eductive. основанная на интерактивной обучающей платформе.
Это единственный в своем роде курс, который научит вас 15 основным шаблонам кодирования, таким как скользящие окна, быстрые и медленные указатели, интервалы слияния и т. д., которые можно использовать для решения более 100 задач leetcode. Это может быть очень полезно для тех, кто готовится к собеседованию по программированию или просто хочет лучше изучить программирование.
Это все о том, как удалить повторяющиеся символы из String в Java. Помимо обучения решению этих часто задаваемых проблем с кодированием, есть еще несколько вещей, которые нужно изучить. Во-первых, используя структуру данных, вы можете значительно упростить логику и код.
Во-вторых, используя дополнительную память, вы можете снизить временную сложность вашего алгоритма или ускорить решение. Вы также узнали, как удалять дубликаты из String, что очень важно с точки зрения собеседования.
- Как преобразовать числовую строку в целое число? (решение)
- Как напечатать повторяющиеся символы из строки? (решение)
- 21 проблема кодирования строк для Java-разработчиков (вопросы)
- Как запрограммировать печать первого неповторяющегося символа из строки? (решение)
- Как проверить, содержит ли строка только цифры? (решение)
- Как проверить, является ли строка палиндромом? (решение)
- Как подсчитать количество гласных и согласных в строке? (решение)
- Как проверить, являются ли две строки анаграммами друг друга? (решение)
- Как найти повторяющиеся символы в строке? (решение)
- Как перевернуть строку в Java с помощью итерации и рекурсии? (решение)
- Как подсчитать вхождение заданного символа в строку? (решение)
- Как найти все перестановки строки? (решение)
- 10 курсов по алгоритмам для успешного программирования Собеседование (курсы)
- Как поменять местами слова в предложении, не используя библиотечный метод? (решение)
- Как перевернуть строку на месте в Java? (решение)
- Как вернуть самый высокий символ в строке? (решение)
Спасибо, что прочитали этот вопрос интервью по программированию. Если вам понравился этот вопрос из интервью по строковому кодированию, поделитесь им с друзьями и коллегами. Если у вас есть какие-либо вопросы или отзывы, оставьте комментарий.
П. S. – Если вы ищете бесплатные курсы по алгоритмам, чтобы улучшить свое понимание структуры данных и алгоритмов, вам также следует просмотреть этот список бесплатных курсов по структуре данных и алгоритмам для программистов.
Удаление повторяющихся букв или символов из строки является одним из наиболее часто встречающихся требований среди разработчиков и наиболее часто задаваемым вопросом программирования на собеседованиях.
Существуют разные подходы к удалению повторяющихся символов или дубликатов из строки в java.
Некоторые из них будут рассмотрены в этом посте.
Объяснение
Этот подход использует значение символов ASCII. Данная строка преобразуется в массив символов, который повторяется для определения повторяющихся символов.
В каждой итерации символ проверяется на существование в логическом массиве. Этот логический массив преобразует символ в его числовой эквивалент и проверяет значение по этому числовому индексу.
Если символ ранее не появлялся, то значение в этой позиции будет ложным (поскольку логический массив по умолчанию будет иметь все ложные значения).
Теперь для значения установлено значение true, и символ добавляется к объекту java.util.StringBuilder.
В следующий раз, когда появляется тот же символ, значение по индексу, равное его числовому значению, признается истинным, и ничего не происходит.
Булев массив инициализируется емкостью 256 с учетом значений ASCII.
Вывод
Строка с дубликатами: afsjeadrffafvgdefeverhfgberAAad
Строка после удаления дубликатов: afsjedrvghbA
Объяснение
Этот метод немного отличается от предыдущего тем, что он использует набор для проверки повторяющихся символов.
Поскольку набор принимает только уникальные элементы, следовательно, в каждой итерации проверяется наличие символа в наборе.
Если он не существует, он добавляется в набор и объект java.lang.StringBuilder, который содержит окончательную строку без повторяющихся символов.
Если символ существует в наборе, цикл продолжается и проверяется следующий символ.
Вывод
Строка с дубликатами: afsjeadrffafvgdefeverhfgberAAad
Строка после удаления дубликатов: afsjedrvghbA
Метод 3. Использование традиционных циклов.
Этот подход не требует применения каких-либо специальных методов или структур данных. Он просто основан на сравнении символов друг с другом.
Объяснение
Этот метод преобразует заданную строку в массив символов, который затем повторяется.
Есть два цикла: внешний цикл начинается с первого индекса массива и внутренний цикл, который начинается с одного индекса, большего, чем внешний цикл, до длины массива.
По сути, мы сравниваем каждый символ со всеми символами перед ним в массиве.
Когда совпадение найдено, мы фиксируем его индекс и запускаем другой цикл, который начинается с индекса повторяющегося символа и продолжается до длины цикла.
В этом третьем цикле мы сдвигаем элементы массива влево, чтобы удалить повторяющийся элемент.
После завершения этого цикла повторяющийся элемент, обнаруженный в этой итерации, удаляется, а длина массива уменьшается на единицу.
Это сделано потому, что при смещении элементов влево элементы в конце массива дублируются на каждой итерации третьего цикла.
Наконец, после завершения циклов у нас есть массив, в котором все повторяющиеся элементы удалены, но есть некоторые повторяющиеся элементы в конце массива.
Длина массива в этой точке содержит индекс последнего неповторяющегося элементаt.
Поэтому из этого массива создается новая строка, и вызывается ее метод substring() для удаления повторяющихся символов в конце с использованием обновленной длины.
Метод 4. Использование потоков Java 8.
В Java 8 введена концепция потоков, в которой массив может быть представлен в виде последовательности элементов, и над этими элементами могут выполняться операции.
Новый метод chars добавлен в класс java.lang.String в java 8.
chars возвращает поток символов в строке. Вызов отдельного метода в этом потоке удаляет повторяющиеся элементы и возвращает другой поток.
Используйте метод forEach этого потока для повторения.
В каждой итерации добавляйте текущую диаграмму в java.lang.StringBuffer .
После завершения итерации буфер преобразуется в строку с помощью метода toString.
Обратите внимание, что метод forEach принимает лямбда-выражение, которое добавляет текущий символ в java.lang.StringBuffer .
Вывод вышеуказанной программы
Строка с дубликатами: asdasdedsfrgdftg
Строка после удаления дубликатов: asdefrgt
Метод 5. Использование метода indexOf.
В этом подходе используется перегруженный метод indexOf в классе java.lang.String.
Этот метод принимает два аргумента:
и возвращает индекс символа в строке после индекса, переданного в качестве аргумента.
Таким образом, "rear".indexOf('r', 1) вернет 3, так как символ 'r' после индекса 1 присутствует в индексе 3.
indexOf возвращает -1, если символ отсутствует в строке после предоставленного индекса (второй аргумент).
Используя этот подход, можно выяснить, встречается ли символ более одного раза или нет, проверяя его индекс после его позиции.
Пример,
Вывод этой программы
Строка с дубликатами: asdasdedsfrgdftg
Строка после удаления дубликатов: aesrdftg
Обратите внимание, что положение символов в строке с удаленными повторяющимися символами отличается от других методов.
Давайте настроим
Читайте также: