Implementacja stosu przy użyciu kolejki
Źródło: Hackernoon Treść artykułu poświęcona jest rozwiązaniu problemu implementacji stosu przy użyciu tylko dwóch kolejek. Mamy problem z Leetcode :
Zaimplementuj stos „ostatnie weszło, pierwsze wyszło” (LIFO) przy użyciu tylko dwóch kolejek. Zaimplementowany stos musi obsługiwać wszystkie funkcje zwykłego stosu ( push , top , pop i pusty ). Zaimplementuj klasę MyStack:
Dodatkowe Szczegóły:
Przykład 1: Wejście
Wyjście
[null, null, null, 2, 2, fałsz]
Wyjaśnienie
|
Rozwiązanie problemu
Pierwsza opcja
W pierwszym rozwiązaniu wykorzystamy dodatkową pamięć:static class MyStack {
private Queue<Integer> current;
private Queue<Integer> tmp;
public MyStack() {
current = new ArrayDeque<>();
tmp = new ArrayDeque<>();
}
Do tego rozwiązania potrzebujemy dodatkowej kolejki. Zacznijmy od pchnięcia . W przypadku operacji wypychania po prostu dodajemy nowy element do naszej bieżącej kolejki.
public void push(int x) {
current.add(x);
}
Główną sztuczką jest metoda pop . Tutaj umieszczamy wszystkie elementy oprócz ostatniego w kolejce tmp . I teraz ostatni element w kolejce staje się pierwszym wysłanym elementem.
public int pop() {
if (current.isEmpty()){
return -1;
}
int size = current.size();
for (int i = 0; i < size - 1; i ++){
tmp.add(current.poll());
}
int ret = current.poll();
current = tmp;
return ret;
}
A co z najlepszą metodą ? Ta metoda jest podobna do metody pop :
public int top() {
if (current.isEmpty()){
return -1;
}
int size = current.size();
for (int i = 0; i < size - 1; i ++){
tmp.add(current.poll());
}
int ret = current.peek();
tmp.add(current.poll());
current = tmp;
return ret;
}
A w przypadku ostatniej pustej metody powinniśmy po prostu sprawdzić bieżącą kolejkę:
public boolean empty() {
return current.isEmpty();
}
Drugie rozwiązanie
W tej opcji nie będziemy używać dodatkowej pamięci:static class MyStack {
private Queue<Integer> current;
public MyStack2() {
current = new ArrayDeque<>();
}
}
Główną ideą jest tutaj metoda push . Dodajemy bieżący element, a następnie przesuwamy elementy poprzedzające bieżący na koniec kolejki. Przykładowo jeśli mamy kolejkę z elementami [2,1] to używamy push 3 - i pobieramy kolejkę [3,2,1], następnie [1,3,2], [2,1,3] i. .. i wszystkich.
public void push(int x) {
current.add(x);
int size = current.size();
for (int i = 0; i < size-1; i ++){
current.add(current.poll());
}
}
Tutaj mamy już poprawny element i początek kolejki dla wszystkich pozostałych metod.
public int pop() {
return current.poll();
}
public int top() {
return current.peek();
}
public boolean empty() {
return current.isEmpty();
}
Metody klas Java Math
Źródło: Medium W tym poście poznasz możliwości i zakres klasy Java Math. Częścią pakietu Java.lang.Math w języku Java jest klasa Math . Ta klasa udostępnia nam kilka predefiniowanych metod, takich jak min , max , sqrt i inne. Poniżej znajdują się przykłady niektórych metod z klasy Math , które możemy wykorzystać w naszej codziennej pracy. 1. Metoda max() zwraca większą liczbę przekazaną w parametrze:System.out.println(Math.max(5,3));
OUTPUT: 5
2. Metoda sqrt() pokaże nam pierwiastek kwadratowy z liczby przekazanej jako argument:
System.out.println(Math.sqrt(4));
OUTPUT: 2.0
3. Metoda random() zwraca liczbę losową z zakresu od 0 do 1.
System.out.println(Math.random());
OUTPUT: 0.8685304957692445
4. Metoda abs() zwraca bezwzględną wartość dodatnią dowolnej liczby ujemnej. Na przykład, jeśli przekażemy ją jako 0, w rezultacie zwróci 0.
System.out.println(Math.abs(-4));
OUTPUT: 4
System.out.println(Math.abs(4));
OUTPUT: 4
System.out.println(Math.abs(0));
OUTPUT: 0
5. Metoda Floor() zwraca wartość typu double, która jest mniejsza lub równa argumentowi i równa najbliższej matematycznej liczbie całkowitej.
System.out.println(Math.floor(-1.2));
OUTPUT: -2.0
System.out.println(Math.floor(1.2));
OUTPUT: 2.0
GO TO FULL VERSION