การใช้สแต็กโดยใช้คิว
ที่มา: Hackernoon เนื้อหาของบทความนี้มีไว้สำหรับการแก้ปัญหาการนำสแต็กไปใช้โดยใช้เพียงสองคิวเท่านั้น เรามีปัญหากับ Leetcode :
ใช้สแต็กเข้าก่อนออกก่อน (LIFO) โดยใช้เพียงสองคิวเท่านั้น สแต็กที่นำไปใช้จะต้องรองรับฟังก์ชันทั้งหมดของสแต็กปกติ ( push , top , popและEmpty ) ใช้คลาส MyStack:
รายละเอียดเพิ่มเติม:
ตัวอย่างที่ 1: ป้อนข้อมูล
เอาท์พุต
[โมฆะ โมฆะ โมฆะ 2, 2 เท็จ]
คำอธิบาย
|
การแก้ปัญหา
ตัวเลือกแรก
ในแนวทางแรก เราจะใช้หน่วยความจำเพิ่มเติม:static class MyStack {
private Queue<Integer> current;
private Queue<Integer> tmp;
public MyStack() {
current = new ArrayDeque<>();
tmp = new ArrayDeque<>();
}
เราจำเป็นต้องมีคิวเพิ่มเติมสำหรับโซลูชันนี้ เริ่มต้นด้วยการผลักดัน สำหรับ การดำเนินการ พุชเราเพียงเพิ่มองค์ประกอบใหม่ให้กับคิวปัจจุบันของเรา
public void push(int x) {
current.add(x);
}
เคล็ดลับหลักที่นี่คือวิธีป๊อป ที่ นี่ เราใส่องค์ประกอบทั้งหมดยกเว้นองค์ประกอบสุดท้ายลงใน คิว tmp และตอนนี้องค์ประกอบสุดท้ายในคิวก็กลายเป็นองค์ประกอบแรกที่ส่งไป
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;
}
แล้ว วิธีการ ด้านบน ล่ะ ? วิธีนี้คล้ายกับ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;
}
และสำหรับ เมธอด ว่าง อันสุดท้าย เราควรตรวจสอบคิวปัจจุบัน:
public boolean empty() {
return current.isEmpty();
}
วิธีแก้ปัญหาที่สอง
ในตัวเลือกนี้ เราจะไม่ใช้หน่วยความจำเพิ่มเติม:static class MyStack {
private Queue<Integer> current;
public MyStack2() {
current = new ArrayDeque<>();
}
}
แนวคิดหลักที่นี่คือวิธีการพุช เราเพิ่มองค์ประกอบปัจจุบันแล้วย้ายองค์ประกอบก่อนหน้าองค์ประกอบปัจจุบันไปยังจุดสิ้นสุดของคิว ตัวอย่างเช่น หากเรามีคิวที่มีองค์ประกอบ [2,1] เราจะใช้การกด 3 - และรับคิว [3,2,1] จากนั้น [1,3,2], [2,1,3] และ .. และทั้งหมด.
public void push(int x) {
current.add(x);
int size = current.size();
for (int i = 0; i < size-1; i ++){
current.add(current.poll());
}
}
ที่นี่เรามีองค์ประกอบที่ถูกต้องและจุดเริ่มต้นของคิวสำหรับวิธีอื่นๆ ทั้งหมดแล้ว
public int pop() {
return current.poll();
}
public int top() {
return current.peek();
}
public boolean empty() {
return current.isEmpty();
}
วิธีการเรียนคณิตศาสตร์ Java
ที่มา: สื่อ ในโพสต์นี้ คุณจะได้เรียนรู้เกี่ยวกับความสามารถและขอบเขตของคลาส Java Math ส่วนหนึ่งของ แพ็คเกจ Java.lang.Mathในภาษา Java คือคลาสMath คลาสนี้ให้วิธีการที่กำหนดไว้ล่วงหน้าบางอย่างแก่เรา เช่นmin , max , sqrtและอื่น ๆ ด้านล่างนี้เป็นตัวอย่างวิธีการบางอย่างจาก ชั้นเรียน คณิตศาสตร์ที่เราสามารถใช้ในการทำงานประจำวันของเรา 1. เมธอด max()ส่งคืนจำนวนที่มากกว่าที่ส่งผ่านในพารามิเตอร์:System.out.println(Math.max(5,3));
OUTPUT: 5
2. เมธอด sqrt()จะแสดงรากที่สองของจำนวนที่ส่งเป็นอาร์กิวเมนต์:
System.out.println(Math.sqrt(4));
OUTPUT: 2.0
3. วิธี การสุ่ม ()ส่งกลับตัวเลขสุ่มในช่วงตั้งแต่ 0 ถึง 1
System.out.println(Math.random());
OUTPUT: 0.8685304957692445
4. วิธี abs()ส่งกลับค่าบวกสัมบูรณ์ของจำนวนลบใดๆ ตัวอย่างเช่น ถ้าเราส่งค่าเป็น 0 ผลลัพธ์ก็จะคืนค่าเป็น 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. เมธอดfloor()ส่งกลับค่าสองเท่าที่น้อยกว่าหรือเท่ากับอาร์กิวเมนต์และเท่ากับจำนวนเต็มทางคณิตศาสตร์ที่ใกล้ที่สุด
System.out.println(Math.floor(-1.2));
OUTPUT: -2.0
System.out.println(Math.floor(1.2));
OUTPUT: 2.0
GO TO FULL VERSION