Вы можете начать с реализации медленной версии, это может быть намного быстрее, чем вы думаете.Но скажем, это слишком медленно.Тогда это проблема оптимизации.В чем заключается неэффективность?
- "если число" легко, вы можете использовать регулярное выражение или все, что останавливается, когда он находит что-то, что не является цифрой
- ", если следующийСлово «число» так же просто реализовать эффективно.
Теперь проблема с «звездочкой» - это проблема для вас.Ключевым моментом, на который следует обратить внимание, является то, что вам не нужно дублировать строку: вы можете изменить ее на месте, поскольку вы только удаляете элементов.
Попробуйте выполнить это визуальнопрежде чем пытаться его реализовать.
Сохраните два целых числа или итератора, первый из которых говорит о том, где вы в данный момент читаете вашу строку, а второй говорит о том, где вы в данный момент пишете твоя строка.Так как вы стираете только материал, прочитанный всегда будет впереди записанного.
Если вы решите сохранить текущую строку, вам просто нужно продвигать каждое из ваших целых чисел / итераторов по одному и копироватьсоответственно.Если вы не хотите его хранить, просто добавьте строку чтения!Тогда вам нужно только обрезать строку по количеству удаленных звездочек.Сложность просто O (n), без использования какого-либо дополнительного буфера.
Также обратите внимание, что ваш алгоритм будет проще (но эквивалентен), если написать так:
wasNumber = false
Loop through string
if number
set wasNumber = true
else
set wasNumber = false
if asterisk and wasNumber and next word is a number
do nothing // using my algorithm, "do nothing" actually copies what you intend to keep
else
remove asterisk