singlepost

вырезать из строки все слова, встречающиеся более двух раз. << На главную или назад  

Пользователь вводит натуральное число n. Это – длина нашей строки. Необходимо вырезать из этой строки все слова, встречающиеся более двух раз.
Если никто не решится помочь мне с кодом, то киньте хотя бы идею решения. А если решитесь, то очень прошу, делайте комментарии, чтобы мне было понятно. Благодарю!

121 ответов в теме “вырезать из строки все слова, встречающиеся более двух раз.”

  1. 29
    Любомир Семків ответил:

    Пашка ت Джиоев:
    И вправду не верно, спасибо. Не правильно понял.

    И Антон RichDad Кононов:
    єто не Си — С++.

    Андрей (aka_Кэп) Горбоконь:
    думаю никогда :) "чем дальше в лес, тем больше дров" :) Зато много хороших либ. И этот язык мне уже почти родной.

  2. 28
    Антон Кононов ответил:

    Троллинг удался.
    Вот на дельфи

    var s,t: TstringList;
    begin
    s := TStringList.Create;
    t := TStringList.Create;
    s.Text := StringReplace('one words count words telephone words words telephone',' ',#13#10,[rfReplaceAll]);
    t.Text := s.Text;
    t.Sort;
    for i:=0 to t.Count-2 do
    if t[i]=t[i+1] then while s.IndexOf(t[i])>-1 do s.Delete(s.IndexOf(t[i]));
    result := StringReplace(s.Text,#13#10,' ',[rfReplaceAll]);
    s.Free;
    t.Free;
    end;

    ps. немного не оптимально, но работает

  3. 27
    Кирилл Быков ответил:

    В паскале строка без указания ограничения по длине занимает 256 байт и имеет максимальную длину в 255 символов.

  4. 26
    Андрей Горбоконь ответил:

    Выглядит так себе :) учитывая там наличие еще Сишных strtok'ов, которые ни разу не типобезопасные и не контролирующие буфер.
    Использовали бы уж boost.string что ли ^^

    Троллинга ради, решение на Сишарпе

    var list = "one words count words telephone words words telephone".Split(' ');
    var unique = from u in list where list.Count(s => s == u) == 1 select u;
    var result = string.Join(" ", unique);

    Когда же мы сможем получать, то что хотим без головной боли и на плюсах? :)

  5. 25
    Пашка Джиоев ответил:

    Только неправильная реализация похоже. Как я понял задачу, надо удалить повторяющиеся слова, а те что не повторяются оставить в исходном порядке. В приведеном коде:
    1) Каждого слова остается по одной копии, а надо если какое-то слово встречается, например, дважды, удалить оба вхождения.
    2) В итоге оставшиеся слова идут в лексикографическом порядке, а надо в исходном.

  6. 24
    Антон Кононов ответил:

    мда) ниче не понял в си, но выглядит прикольно

  7. 23
    Любомир Семків ответил:

    С STL реализация метода который предложил АнтонКононов выглядит очень привлекательно:

    //paste.org.ru/?qjc19d

  8. 22
    Cyber Max ответил:

    #21
    ну вот.. STL твой друг :) )

  9. 21
    Ден Савченко ответил:

    #3 красивое решение. Думал примерно так же.

  10. 20
    Михаил Асташкевич ответил:

    #19: опять же, есть еще FreePascal

  11. 19
    Саня Zaitsev ответил:

    C++

  12. 18
    Михаил Асташкевич ответил:

    #15:в FreePascal – есть.

  13. 17
    Пашка Джиоев ответил:

    #13 Это видимо для delphi только прокатит.
    Для TP прийдется поизвращаться немного :)
    //forum.sources.ru/index.php?showtopic=51192

  14. 16
    Пашка Джиоев ответил:

    254 по-моему ограничение, там вроде любая строка занимает 255 байт, но нулевой байт используется для хранения длины строки

  15. 15
    Антон Кононов ответил:

    #13: в паскале нет, а в дельфи будет

    но! динамические массивы появились в дельфи начиная с 4.01 версии (в 4.0 еще не было)

  16. 14
    Антон Кононов ответил:

    #10: врать не буду, но мне помнится чуть меньше 255… может 254 или 250… но 255 у меня в прошлом не получалось запихать в TP7

  17. 13
    Александр Васюченко ответил:

    понятно, спасибо

  18. 12
    Александр Васюченко ответил:

    #8 мне помниться, что там ограничена 255 символами

  19. 11
    Михаил Асташкевич ответил:

    Строки в паскале… Смотря какая версия) В поздних версиях есть ansistring – строка неограниченной длины.

    #9
    Нету, но можно обявить динамический массив и потом по мере надобности менять его длину.

  20. 10
    Александр Васюченко ответил:

    #11
    приведите код плиз как объявитьдинамический массив

  21. 9
    Михаил Асташкевич ответил:

    a:array of longint;


    setlength(a,100); //массив начинается с 0

    Не уверен правда, будет ли это работать в TP

  22. 8
    Пашка Джиоев ответил:

    Ну на паскале тоже можно с динамической памятью работать.

  23. 7
    Антон Кононов ответил:

    на паскале строка у нас не ограничена ли случайно? :) 250 символов

  24. 6
    Александр Васюченко ответил:

    #7
    можно. а там есть аналогstd::list ?
    если нет, то надо самому писать класс – двусвязного списка

  25. 5
    Александр Васюченко ответил:

    #5 вы верно подметили, я знал об этом перед тем как писать. Написал так для простоты. А может человеку вообще на паскале прога надо?

  26. 4
    Cyber Max ответил:

    #4 уж очень вы расточительно память используете!!!
    char s_word[100]; – а если у меня слово будет 101 байт?
    - поменять на std::string

    struct word words[200]; – а если будет только 2 слова? тогда 198 структур на стеке в пустую?или например 202 слова – тогда срыв стека!!!
    - поменять на std::list<struct word>

  27. 3
    Александр Васюченко ответил:

    да просто. создаём структуру вида

    struct word
    {
    char s_word[100]; // слово
    int n_repeat; // количество повторений этого слова
    }

    создаём массив этой структуры, скажем так из 200 элементов:

    struct word words[200];

    сканируем строку. если встречаем новое слово, то заполняем новый элемент этого массива, где в поле s_word пишем это слово, а в
    поле n_repeat пишем единицу, а если встречаем слово, которое уже было ранее (повторяющееся), то в элементе массива с этим
    словом увеличиваем поле n_repeat на единицу.

    все, массив сформирован. теперь перебираем по порядку каждый элемент массива и слова с полем n_repeat>1 удаляем из строки.

  28. 2
    Николай Немов ответил:

    Ну… создаем новую строку и структуту строк. В структуру забиваем все слова, которые нам встречаются при движении по строке с проверкой, не всречалось ли такое слово раньше. Если встречалось, то увеличиваем счетчик у данного слова. Так мы узнаем слова, которые нужно выкинуть. А потом записываем в новую строку нашу изначальную строку без тех слов, которые нам надо выкинуть.
    Как я тебе код напишу, если ты даже язык не сказал?!

  29. 1
    Антон Кононов ответил:

    1) режем строку на слова, слова суем в массив
    2) сортируем массив
    3) если в массиве предыдущий и текущий элемент одинаковы, то это слово удаляем из строки

    как-то так на вскидку

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.