Добавить символ в строку в заданной позиции
Мы представим три реализации простой функции, которая принимает исходную строку, символ и позицию, в которую нам нужно ее добавить.
Поскольку класс String является окончательным и неизменяемым , функция должна возвращать новую строку с добавленным символом.
2. Использование массива символов
Здесь идея состоит в том, чтобы создать новый массив символов и скопировать символы из исходной строки перед заданной позицией.
После этого мы помещаем новый символ в позицию и копируем остальные символы из исходной строки в последующие позиции нового массива.
Наконец, мы создаем нужную строку из этого массива.
public String addChar(String str, char ch, int position) int len = str.length(); char[] updatedArr = new char[len + 1]; str.getChars(0, position, updatedArr, 0); updatedArr[position] = ch; str.getChars(position, len, updatedArr, position + 1); return new String(updatedArr); >
По сравнению с двумя другими методами, это низкоуровневый подход к проектированию, обеспечивающий наибольшую гибкость.
3. Использование метода подстроки
Более простой и высокоуровневый подход — использовать метод substring() класса String . Он подготавливает строку путем объединения:
- Подстрока исходной строки перед позицией
- Новый персонаж
- Подстрока исходной строки после позиции
public String addChar(String str, char ch, int position) return str.substring(0, position) + ch + str.substring(position); >
Хотя приведенный выше код более удобочитаем, у него есть недостаток, заключающийся в том, что он создает ряд временных объектов для определения результата. Поскольку String является неизменяемым классом, каждый вызов его метода substring() создает новый экземпляр String .
Наконец, когда мы объединяем части, компилятор создает объект StringBuilder для добавления их по одной. Каждый объект String и StringBuilder выделяет отдельные области памяти для своего внутреннего массива символов.
Эта реализация также должна трижды копировать все символы из одного массива в другой.
Если нам нужно вызвать метод огромное количество раз, временные объекты могут заполнить динамическую память, и это будет очень часто запускать сборщик мусора. Это также может в некоторой степени повлиять на производительность.
4. Использование StringBuilder
StringBuilder — это служебный класс, предоставляемый библиотекой Java для создания объектов String и управления ими различными способами.
Мы можем реализовать ту же функциональность, используя метод insert() класса StringBuilder :
public String addChar(String str, char ch, int position) StringBuilder sb = new StringBuilder(str); sb.insert(position, ch); return sb.toString(); >
Приведенный выше код должен создать только один объект StringBuilder , чтобы вставить символ в позицию. Он выделяет тот же объем памяти, что и исходная строка , но для создания места для нового символа базовый массив сдвигает следующие символы на 1 позицию.
Хотя использование StringBuilder может быть медленнее, оно не требует памяти для инициализации временных объектов. Мы также получаем простой и читаемый код.
5. Вывод
В этой статье мы сосредоточились на нескольких способах добавления символа в объект String в Java . Мы видели, что реализация с использованием массива символов обеспечивает наилучшую производительность, а реализация с использованием метода подстроки обеспечивает более читаемый подход.
Предпочтительным способом реализации решения является использование класса StringBuilder , так как он прост, менее подвержен ошибкам и обеспечивает хорошую и стабильную производительность .
Как обычно, полный исходный код приведенного выше руководства доступен на GitHub .
- 1. Введение
- 2. Использование массива символов
- 3. Использование метода подстроки
- 4. Использование StringBuilder
- 5. Вывод
Добавить символ в конец строки в C++
В этой быстрой статье мы рассмотрим различные методы добавления символа в конец строки в C++.
1. Использование push_back() функция
Рекомендуемый подход заключается в использовании стандартного push_back() функция, которая перегружена для символов и добавляет символ в конец строки.
std :: string s = «C+» ;
s . push_back ( ch ) ;
std :: cout << s ;
2. Использование += оператор
Мы также можем использовать string::operator+= , который перегружен для символов и внутренних вызовов push_back() функция.
std :: string s = «C+» ;
std :: cout << s ;
3. Использование append() функция
Другим приемлемым подходом является использование append() функция для добавления одной копии символа в конец строки, как показано ниже:
std :: string s = «C+» ;
s . append ( 1 , ch ) ;
std :: cout << s ;
4. Использование std::stringstream функция
Другой хорошей альтернативой является использование строкового потока для преобразования между строками и другими числовыми типами.
std :: string s = «C+» ;
std :: stringstream ss ;
std :: cout << s ;
5. Использование insert() функция
Наконец, мы также можем использовать insert() Функция для вставки одной копии символа в указанную позицию в строке.
std :: string s = «C+» ;
s . insert ( s . length ( ) , 1 , ch ) ;
std :: cout << s ;
Это все о добавлении символа в конец строки в C++.
Оценить этот пост
Средний рейтинг 4.57 /5. Подсчет голосов: 98
Голосов пока нет! Будьте первым, кто оценит этот пост.
Сожалеем, что этот пост не оказался для вас полезным!
Расскажите, как мы можем улучшить этот пост?
Спасибо за чтение.
Пожалуйста, используйте наш онлайн-компилятор размещать код в комментариях, используя C, C++, Java, Python, JavaScript, C#, PHP и многие другие популярные языки программирования.
Как мы? Порекомендуйте нас своим друзьям и помогите нам расти. Удачного кодирования 🙂
Подписывайся
7 Комментарии
Большинство голосов
Новейшие Самый старый
Встроенные отзывы
Просмотреть все комментарии
Просмотр комментариев
Загрузить больше комментариев
Просматривать
Подпишитесь на новые публикации
- Все проблемы
- Практика DSA
- 100 самых популярных задач
- 50 лучших классических задач
- Лучшие алгоритмы
- Компилятор С/С++
- Компилятор Java
- Компилятор Python
- Компилятор JavaScript
- компилятор PHP
- Компилятор C#
- Свяжитесь с нами
- Политика конфиденциальности
- условия обслуживания
- Подпишитесь на новые публикации
Techie Delight © 2023 Все права защищены.
Этот веб-сайт использует файлы cookie. Используя этот сайт, вы соглашаетесь с использованием файлов cookie, нашей политикой, условиями авторского права и другими условиями. Читайте наши Политика конфиденциальности. Понятно
Как вставить символ в строку python?
Как вставить символ по определенному индексу в строку?
- Вопрос задан более трёх лет назад
- 24440 просмотров
Комментировать
Решения вопроса 2
Сергей Карбивничий @hottabxp Куратор тега Python
Сначала мы жили бедно, а потом нас обокрали..
Можно использовать срезы:
a = 'bigben' print(a[:3],'.',a[3:],sep='') >>> big.ben
или так: print(f’.’)
Ответ написан более трёх лет назад
Нравится 2 1 комментарий
Сергей Ильин @sunsexsurf
вообще, задание похоже на энтерпрайзный хеллоу-ворлд. Типа, ну ок, ф-строки — норм, теперь давайте регулярками разобъем. Или как-то еще мэтчить будем ))
Тимур Покровский @Makaroshka007
Ответ написан более трёх лет назад
Комментировать
Нравится 1 Комментировать
Ответы на вопрос 1
*новое слово*=слово[:позиция-1]+’.’+слово[позиция:]
word = ‘bigben’
position = 3
new_word = word[:position — 1] + ‘.’ + word[position:]
Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать
Ваш ответ на вопрос
Войдите, чтобы написать ответ
- Python
Как превратить свою аватарку в Telegram в часы?
- 1 подписчик
- 4 часа назад
- 26 просмотров
вставка символа в строку
Задача простая — есть строка, например std::string(«sfsfsgsdshhdfjj»), необходимо вставить через каждый второй символ символ «-«.Не пойму как такое реализовать, пожалуйста подскажите.
Отслеживать
задан 28 апр 2016 в 5:19
1,991 3 3 золотых знака 16 16 серебряных знаков 34 34 бронзовых знака
Не правьте, пожалуйста, вопросы, изменяя метки, меняя точки на запятые и добавляя кавычки/ненужные метки, зарабатывая по +2 репутации. Вносите бОльшие изменения в вопрос, чтобы он был полезней, либо не меняйте его. Это не приносит пользы вопросам и сообществу в целом. Спасибо.
15 сен 2016 в 14:52
@Denis — пожалуйста! Исправлять орфографические ошибки и правила расстановки знаков препинания не нужно? Нет? Делать вопросы более понятными для всех не нужно. Я все исправляю по правилам форума. Я не просто зарабатываю 2 балла репутации — но и делаю полезное дело! И да — это приносит пользу сообществу!
15 сен 2016 в 16:14
Например, вот эта правка не несёт пользы вопросу — кавычки тут не нужны, как и точка после ссылки, есть даже причина для отклонения таких правок — «Правка никак не делает сообщения более простым к прочтению, не упрощает его поиск, точность или доступность. Изменения абсолютно излишни или явно ухудшают читаемость.»
16 сен 2016 в 6:55
3 ответа 3
Сортировка: Сброс на вариант по умолчанию
Самый простой способ, пожалуй, — создать новую строку и посимвольно туда запихивать все это хозяйство.
string s("sfsfsgsdshhdfjj"); string d; for(auto c: s)
Update Как оказалось, не совсем верно понял, дефис надо через два на третий. Примерно так:
string d; for(size_t i = 0; i < s.length(); ++i) < d += s[i++]; if (i < s.length()) < d += s[i]; d += '-'; >>
Отслеживать
ответ дан 28 апр 2016 в 5:39
218k 15 15 золотых знаков 118 118 серебряных знаков 229 229 бронзовых знаков
я бы добавил: d.reserve(s.length()*2-1)
28 апр 2016 в 5:58
Да, согласен, несколько быстрее. Тут — ideone.com/Jmlwde — сравнение с резервированием, без и с методом вставкой.
28 апр 2016 в 6:17
А вообще, самый быстрый вот такой: ideone.com/B4C7xG объясняю почему: operator[] не выполняет никаких проверок вообще, а operator+= — выполняет. Как минимум — вдруг ёмкость исчерпалась, а значит нужно как бы и памяти добавить. Правило наименьшего оверхеда вкупе с наименьшим удивлением. Ваш вариант ещё и ошибку содержит: всегда добавляется — во конце, хотя не должен вообще. Пруф: ideone.com/VbE5RW
28 апр 2016 в 8:02
Решение @Harry быстрое, а если жалко памяти на два буффера сразу, то можно либо как у вас или так (дополнительной памяти O(1)):
// Резервируем память, что бы исключить реаллокации при вставке s.reserve(s.length()*3/2); for (size_t i = 2; i < s.length(); i+=2) s.insert(i++, 1, '-'); // инкремент тут нужен, что бы уйти с только что вставленного '-'
Минус: оно медленное за счёт того, что при каждой вставке нужно делать memmove / memcpy для оставшихся символов.
UPD: поправлено под условие (каждый второй символ)
UPD2: самый (пока?) шустрый вариант (дополнительной памяти O(n)):
string str; str.resize(s.length() * 3/2); size_t size = 0; for (size_t i = 0; i < s.length(); ++i) < str[size++] = s[i++]; if (i < s.length()) < str[size++] = s[i]; if (i != s.length() - 1) str[size++] = '-'; >> // ;-) str.resize(size);