#c #debugging #unordered-map
#c #отладка #неупорядоченная карта
Вопрос:
Найдите наиболее распространенное слово из введенного текста, исключая список заданных слов. Если существует максимальное количество слов, отобразите их все.
Мои слова метода для 21/24 тестовых случаев, я, кажется, не могу вспомнить 3 тестовых случая, которые мне не хватает.
Я добавляю код, который у меня есть прямо сейчас, который, по моему мнению, эффективен. Я не хочу другого способа его реализации прямо сейчас (хотя предложения приветствуются), я просто хотел бы пораскинуть мозгами о возможных тестовых примерах, которые я пропускаю.
vector<string> mostCommonWord(string paragraph, vector<string>amp; banned) {
unordered_map<string, int>m;
for(int i = 0; i < paragraph.size();){
string s = "";
while(i < paragraph.size() amp;amp; isalpha(paragraph[i])) s.push_back(tolower(paragraph[i ])); // go through till you find one word completely
while(i < paragraph.size() amp;amp; !isalpha(paragraph[i])) i ; // avoid all the white spaces and other characters
m[s] ; // include the word found and increment its count
}
for(auto x: banned) m[x] = 0; // make the count of all the banned words to be 0
vector<string> resu<
string res = "";
int count = INT_MIN;
// find the maximum count
for(auto x: m)
if(x.second > count) count = x.second;
// we might have the case where all the words were in banned words, which would result the count == -1, so return an empty vector in this case
if(count <= 0) return resu<
// add the words corresponding to that to the final vector<string>
for(auto x: m)
if(x.second == count) result.push_back(x.first);
return resu<
}
Это работает для всех сценариев, которые я могу придумать, но не удается выполнить 3 тестовых примера.
Мне не предоставлен доступ к этим тестовым примерам, я просто хотел бы обсудить, что это могло бы быть!
Комментарии:
1.
for (const autoamp; x: banned) m.erase(x);
кажется лучше, обрабатывает абзац только с запрещенными словами.
Ответ №1:
- Вы уверены в том, что другие символы (цифры) следует рассматривать как разделители слов?
- Если
paragraph
начинается с пробела или не с алфавитного символа, вы вставите пустую строку в карту:m[""] = 1
.
Комментарии:
1. На самом деле это очень хорошее наблюдение! Спасибо. Какие-либо другие сценарии, которые вы можете придумать? И да, в качестве слов рассматриваются только английские алфавиты!