Informatică, întrebare adresată de Patrick100, 8 ani în urmă

Regula 1: Nu repetăm cuvinte
E-mailul e format din litere mici ale alfabetului englez și spații. Sarcina ta e acum să îl convertești într-o listă de cuvinte ordonate alfabetic, în care fiecare cuvânt din textul inițial să apară o singură dată.

Date de intrare
Vei citi de la tastatură textul e-mailului care trebuie convertit. Acesta poate să se întindă pe mai multe linii.

Date de ieșire
Se vor afișa cuvintele distincte din textul citit, în ordine alfabetică, câte unul pe fiecare rând.

Restricții și precizări
Textul nu conține mai mult de 100000 de cuvinte, iar fiecare cuvânt poate conține până la 20 de caractere.
Pentru a scurta timpul de execuție al programului tău folosește BufferedReader
Clasa care conține metoda main trebuie să se numească prog
Exemplu
Date de intrare
mersi pentru lista de instructiuni
e de ajutor
mersi
Date de ieșire
ajutor
de
e
instructiuni
lista
mersi
pentru
In java va rog o rezolvare

Răspunsuri la întrebare

Răspuns de andrei750238
2

► PROGRAM JAVA:

import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.util.SortedSet;

import java.util.TreeSet;

public class prog {

   public static void main(String[] args) throws Exception {

       //Creaza BufferedReader pentru intrare standard

       InputStreamReader inputStreamReader = new InputStreamReader(System.in);

       BufferedReader reader = new BufferedReader(inputStreamReader);

       //Set sortat pentru retinerea unei multimi de cuvinte in ordine crescatoare

       SortedSet<String> cuvinte = new TreeSet<>();

       //String care retine linia curenta

       String linie_curenta;

       //Cat timp avem linii de citit, citeste linia

       while((linie_curenta = reader.readLine()) != null){

           //Separa linia in array de cuvinte

           String[] arr = linie_curenta.split(" ");

           //Adauga fiecare cuvant din array in set

           for (String cuv:arr){

               if(cuv.length()==0) continue;

               cuvinte.add(cuv);

           }

       }

       //Afiseaza fiecare cuvant din multimea ordonata

       for(String cuv:cuvinte){

           System.out.println(cuv);

       }

   }

}

► EXPLICATIE:

◘ SortedSet este o interfata care pastreaza o multime sortata de elemente:

  • In cazul stringurilor multimea e sortata automat alfabetic daca nu oferim un comparator propriu. Atunci cand vom scoate cuvintele acestea vor fi automat in ordine crescatoare. Deoarece se foloseste un arbore binar de cautare modificat complexitatea e foarte buna la modificarea elementelor (complexitate logaritmica)
  • Nu sunt permise elemente duplicate, cu aceasi valoare. Daca adaugam un cuvant de mai multe ori acesta va fi retinut in SortedSet o singura data.

Te invit sa cauti mai multe informatii pe internet despre SortedSet daca doresti sa aflii ce alte functii sunt suportate. Idem pentru BufferedReader.

◘ Pentru a marca sfarsitul unui rand la tastatura folosimcombinatia de taste Ctrl + D

Nota : Am implementat bug fix-ul din urma discutiei avute in comentarii (linia selectata in imagine cu albastru)

Anexe:

Patrick100: numarul de cuvinte unice
andrei750238: System.out.println(cuvinte.size());
Patrick100: pe platforma unde am incarcat rezolvare am 6 teste daca pun System.out.println(cuvinte.size()); raspund corect la ultimul test iar daca pun System.out.println(cuvinte.size() - 1); raspund corect la celelalte 5 teste oare cum as putea rezolva
Patrick100: Conteaza de unde incepe parcurgerea?
andrei750238: Ar trebui sa mearga. Nu avem array sa putem incepe de la 1 sau de la 0.
andrei750238: Verifica daca nu cumva sunt adaugate stringuri cu spatii sau stringuri goale in set.
andrei750238: Desi nu ar trebui
Patrick100: Este depre spatiu de la inceputul textului sau a sirului
andrei750238: Introdu intre instructiunile de pe liniile 23 si 24 urmatoarea instructiune :
if(cuv.length()==0) continue;

In acest mod se sare peste adaugarea stringurilor goale.
andrei750238: Am editat raspunsul
Alte întrebări interesante