Documente Academic
Documente Profesional
Documente Cultură
Prezentare 11:
Exemple
PROGRAMARE ORIENTATA
OBIECT
2020
Permutari
22.11.2020 POO 2
Permutari
Solutia 1: sortam sirurile si le comparam
String sort(String s) {
char[] continut = s.toCharArray();
java.util.Arrays.sort(continut);
return new String(continut);
}
22.11.2020 POO 3
Permutari
Solutia 2: permutarile au acelasi numar de aparitii ale caracterelor
boolean permutare(String s, String t) {
if (s.length() != t.length()) return false;
int [] litere = new int[128];
for (int i = 0; i < s.length(); i++)
litere[s.charAt(i)]++;
for (int i = 0; i < t.length(); i++) {
litere[t.charAt(i)]--;
if (litere[t.charAt(i)] < 0)
return false;
}
return true; //litere nu contine valori negative, deci nici pozitive
}
22.11.2020 POO 4
Duplicate
22.11.2020 POO 5
Duplicate
Solutia 1: memorie suplimentara – hash table
void elimDup(LinkedListNode n) {
HashSet<Integer> set = new HashSet<>();
LinkedListNode prev = null;
while (n != null) {
if (set.contains(n.data))
prev.next = n.next; Complexitate: O(n)
else {
set.add(n.data);
prev = n;
}
n = n.next;
}
}
22.11.2020 POO 6
Duplicate
Solutia 2: fara memorie suplimentara
void elimDup(LinkedListNode cap) {
LinkedListNode curent = cap;
while (curent != null) {
// elimina urmatoarele noduri cu aceeasi valoare
LinkedListNode urm = curent;
while (urm.next != null) { Complexitate: O(n^2)
if (urm.next.data == curent.data)
urm.next = urm.next.next;
else
urm = urm.next;
}
curent = curent.next;
}
22.11.2020 } POO 7
Eliminarea unui nod din interiorul unei liste
22.11.2020 POO 8
Eliminarea unui nod din interiorul unei liste
boolen elimNod(LinkedListNode n) {
if (n == null || n.next == null)
return false;
LinkedListNode urm = n.next;
n.data = urm.data;
n.next = next.next;
return true;
}
22.11.2020 POO 9
Vector circular
22.11.2020 POO 10
Vector circular
22.11.2020 POO 11
Vector circular
private int convert(int ind) {
if (ind < 0)
ind += elem.length; // -8 % 3 = -2
return (cap + ind) % elem.length;
}
public T get(int i) {
if (i < 0 || i >= elem.length)
throw new java.lang.IndexOutOfBoundsException(“…”);
return elem[convert(i)];
}
22.11.2020 POO 12
Vector circular
22.11.2020 POO 13
Vector circular
Implementarea interfetei Iterator a.i. sa putem scrie:
VectorCircular<String> arr = …
for (String s: arr) { …}
Clasa VectorCircular<T> trebuie sa implementeze interfata
Iterable<T>
Implica adaugarea metodei iterator()
Crearea unui VectorCircularIterator<T> care implementeaza
Iterator<T> si definirea metodelor hasNext(), next() si
remove()
22.11.2020 POO 14
Vector circular
public class VectorCircular<T> implements Iterable<T> {
…
public Iterator<T> iterator() {
return new VectorCircularIterator();
}
public VectorCircularIterator() {}
@override
public Boolean hasNext() {
return curent < elem.length – 1;
}
22.11.2020 POO 15
Vector circular
@override
public T next() {
current++;
return (T) elem[convert(curent)];
}
@override
public void remove() {
throw new UnsupportedOperationException(“Remove nu este
implementata”);
}
}
}
22.11.2020 POO 16
Gruparea anagramelor
Sa se scrie o metoda care sorteaza un vector de cuvinte
a.i. toate anagramele sa fie una langa alta
Anagrame sunt cuvintele care au aceleasi litere in alta
ordine
22.11.2020 POO 17
Gruparea anagramelor
Solutia 1: sortam sirurile modificand comparatorul
class CompAnagram implements Comparator<String> {
private String sortChars(String s) {
char[] continut = s.toCharArray();
Arrays.sort(continut);
return new String(continut);
} Complexitate: O(n log(n))
public int compare(String s1, String s2) {
return sortChars(s1).compareTo(sortChars(s2));
}
}
…
Arrays.sort(arr, new CompAnagram()); //sortam vectorul folosind
comparatorul
23.11.2020 POO 18
Gruparea anagramelor
Solutia 2: utilizam o tabela hash care mapeaza cuvantul
sortat la lista anagramelor sale
22.11.2020 POO 19
Gruparea anagramelor
22.11.2020 POO 20
Gruparea anagramelor
String sortChars(string s) {
char[] continut = s.toCharArray();
Arrays.sort(continut);
return new String(continut);
}
22.11.2020 POO 21
Varfuri si vai
Intr-un vector de numere intregi, un varf este un element
care este mai mare sau egal in raport cu numerele
adiacente iar o vale este un element care este mai mic sau
egal in raport cu vecinii sai. De exemplu pentru vectorul
[5, 8, 6, 2, 3, 4, 6], {8, 6} sunt varfuri, iar {5, 2} sunt vai.
Dandu-se un vector de numere intregi, sa se sorteze
vectorul intr-o alternanta de varfuri si vai.
Exemplu:
Input: [5, 3, 1, 2, 3]
Output: [5, 1, 3, 2, 3]
23.11.2020 POO 22
Varfuri si vai
Solutia 1:
1. Sortam vectorul in ordine ascendenta
2. Iteram in vector incepand cu indexul 1si sarind peste
2 elemente
3. Pentru fiecare element il interschimbam cu
precedentul. Cum fiecare 3 elemente apar in ordinea
mic <= mediu <= mare, interschimband elementele
vom pune elementul mediu ca varf
014789
• 0 e ok
• 1 trebuie schimbat; interschimbam 1 cu 0
104789
• 4 e ok
• Interschimbam 7 cu 4
107489
• Interschimbam 9 cu 8
107489
23.11.2020 POO 23
Varfuri si vai
23.11.2020 POO 24
Varfuri si vai
Solutia 2: putem optimiza solutia precedenta, eliminand
sortarea. Sa consideram secventele:
0 1 2 -> 0 2 1
0 2 1 //varf
1 0 2 -> 1 2 0
1 2 0 //varf
2 1 0 ->1 2 0
2 0 1 -> 0 2 1
Vrem ca elementul din mijloc sa fie varf – interschimbam
elementul din mijloc cu cel mai mare dintre elementele
adiacente.
Poate o astfel de interschimbare sa “strice” ordonarea
facuta deja? Daca interschimbam mijlocul cu stanga,
stanga este deja o vale, deci vom pune un element si mai
mic ca vale.
23.11.2020 POO 25
Varfuri si vai
23.11.2020 POO 26
Varfuri si vai
23.11.2020 POO 27