JavaRush /Blog Java /Random-MS /Coffee break #162. Pelaksanaan timbunan menggunakan baris...

Coffee break #162. Pelaksanaan timbunan menggunakan baris gilir. Kaedah kelas Matematik Java

Diterbitkan dalam kumpulan

Melaksanakan timbunan menggunakan baris gilir

Sumber: Hackernoon Kandungan artikel ini dikhaskan untuk menyelesaikan masalah melaksanakan timbunan menggunakan hanya dua baris gilir. Coffee break #162.  Pelaksanaan timbunan menggunakan baris gilir.  Kaedah kelas Matematik Java - 1Kami mempunyai masalah dengan Leetcode :

Laksanakan tindanan masuk dahulu keluar terakhir (LIFO) menggunakan hanya dua baris gilir. Tindanan yang dilaksanakan mesti menyokong semua fungsi tindanan biasa ( tolak , atas , pop dan kosong ).

Laksanakan kelas MyStack:

  • void push(int x) Tolak elemen x ke bahagian atas tindanan.

  • int pop() Mengalih keluar elemen di bahagian atas timbunan dan mengembalikannya.

  • int top() Mengembalikan elemen di bahagian atas timbunan.

  • boolean empty() Mengembalikan benar jika timbunan kosong, palsu sebaliknya .

Maklumat tambahan:

  • Anda hanya perlu menggunakan operasi baris gilir standard, yang bermaksud hanya tolak ke belakang , intip/pop dari hadapan , saiz dan operasi kosong dibenarkan .

  • Bergantung pada bahasa pengaturcaraan anda, baris gilir mungkin tidak disokong secara asli. Tetapi anda boleh mensimulasikan baris gilir menggunakan senarai atau deque (baris berganda) jika anda hanya menggunakan operasi baris gilir standard.

Contoh 1:

Input

["MyStack", "push", "push", "top", "pop", "empty"]
[[], [1], [2], [], [], []]

Pengeluaran

[null, null, null, 2, 2, false]

Penjelasan

MyStack myStack = new MyStack();
myStack.push(1);
myStack.push(2);
myStack.top(); // возвращает 2
myStack.pop(); // возвращает 2
myStack.empty(); // возвращает False

Penyelesaian masalah

Pilihan pertama

Dalam penyelesaian pertama kami akan menggunakan memori tambahan:
static class MyStack {
  private Queue<Integer> current;
  private Queue<Integer> tmp;

  public MyStack() {
    current = new ArrayDeque<>();
    tmp = new ArrayDeque<>();
  }
Kami memerlukan baris gilir tambahan untuk penyelesaian ini. Mari kita mulakan dengan push . Untuk operasi tolak , kami hanya menambah elemen baharu pada baris gilir semasa kami.
public void push(int x) {
  current.add(x);
}
Helah utama di sini ialah kaedah pop . Di sini kami meletakkan semua elemen kecuali yang terakhir ke dalam baris gilir tmp . Dan kini elemen terakhir dalam baris gilir menjadi elemen pertama yang dihantar.
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;
}
Bagaimana dengan kaedah teratas ? Kaedah ini serupa dengan 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;
}
Dan untuk kaedah kosong terakhir , kita hanya perlu menyemak baris gilir semasa:
public boolean empty() {
  return current.isEmpty();
}

Penyelesaian kedua

Dalam pilihan ini kami tidak akan menggunakan memori tambahan:
static class MyStack {

  private Queue<Integer> current;

  public MyStack2() {
    current = new ArrayDeque<>();
  }
}
Idea utama di sini ialah kaedah tolak . Kami menambah elemen semasa dan kemudian memindahkan elemen sebelum yang semasa ke penghujung baris gilir. Sebagai contoh, jika kita mempunyai baris gilir dengan elemen [2,1], kita menggunakan push 3 - dan dapatkan baris gilir [3,2,1], kemudian [1,3,2], [2,1,3] dan. .. dan semua.
public void push(int x) {
  current.add(x);
  int size = current.size();

  for (int i = 0; i < size-1; i ++){
    current.add(current.poll());
  }
}
Di sini kita sudah mempunyai elemen yang betul dan permulaan baris gilir untuk semua kaedah lain.
public int pop() {
  return current.poll();
}

public int top() {
  return current.peek();
}

public boolean empty() {
  return current.isEmpty();
}

Kaedah kelas Matematik Java

Sumber: Sederhana Dalam siaran ini, anda akan mempelajari tentang keupayaan dan skop kelas Matematik Java. Coffee break #162.  Pelaksanaan timbunan menggunakan baris gilir.  Kaedah Kelas Matematik Java - 2Sebahagian daripada pakej Java.lang.Math dalam bahasa Java ialah kelas Math . Kelas ini memberikan kami beberapa kaedah yang dipratentukan seperti min , max , sqrt dan lain-lain. Di bawah adalah contoh beberapa kaedah dari kelas Matematik yang boleh kita gunakan dalam kerja harian kita. 1. Kaedah max() mengembalikan bilangan yang lebih besar yang diluluskan dalam parameter:
System.out.println(Math.max(5,3));
OUTPUT: 5
2. Kaedah sqrt() akan menunjukkan kepada kita punca kuasa dua nombor yang diluluskan sebagai hujah:
System.out.println(Math.sqrt(4));
OUTPUT: 2.0
3. Kaedah rawak() mengembalikan nombor rawak dalam julat dari 0 hingga 1.
System.out.println(Math.random());
OUTPUT: 0.8685304957692445
4. Kaedah abs() mengembalikan nilai positif mutlak sebarang nombor negatif. Sebagai contoh, jika kita melepasinya sebagai 0, ia akan mengembalikan 0 sebagai hasilnya.
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. Kaedah floor() mengembalikan nilai berganda yang kurang daripada atau sama dengan hujah dan sama dengan integer matematik terdekat.
System.out.println(Math.floor(-1.2));
OUTPUT: -2.0
System.out.println(Math.floor(1.2));
OUTPUT: 2.0
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION