1671 設計前中後佇列

2021-10-10 23:47:08 字數 3107 閱讀 6921

題目描述:

請你設計乙個佇列,支援在前,中,後三個位置的 push 和 pop 操作。

請你完成 frontmiddleback 類:

frontmiddleback() 初始化佇列。

void pushfront(int val) 將 val 新增到佇列的 最前面 。

void pushmiddle(int val) 將 val 新增到佇列的 正中間 。

void pushback(int val) 將 val 新增到隊裡的 最後面 。

int popfront() 將 最前面 的元素從佇列中刪除並返回值,如果刪除之前隊列為空,那麼返回 -1 。

int popmiddle() 將 正中間 的元素從佇列中刪除並返回值,如果刪除之前隊列為空,那麼返回 -1 。

int popback() 將 最後面 的元素從佇列中刪除並返回值,如果刪除之前隊列為空,那麼返回 -1 。

請注意當有 兩個 中間位置的時候,選擇靠前面的位置進行操作。比方說:

將 6 新增到 [1, 2, 3, 4, 5] 的中間位置,結果陣列為 [1, 2, 6, 3, 4, 5] 。

從 [1, 2, 3, 4, 5, 6] 的中間位置彈出元素,返回 3 ,陣列變為 [1, 2, 4, 5, 6] 。

示例 1:

輸入:[「frontmiddlebackqueue」, 「pushfront」, 「pushback」, 「pushmiddle」, 「pushmiddle」, 「popfront」, 「popmiddle」, 「popmiddle」, 「popback」, 「popfront」]

[, [1], [2], [3], [4], , , , , ]

輸出:[null, null, null, null, null, 1, 3, 4, 2, -1]

解釋:frontmiddlebackqueue q = new frontmiddlebackqueue();

q.pushfront(1); // [1]

q.pushback(2); // [1, 2]

q.pushmiddle(3); // [1, 3, 2]

q.pushmiddle(4); // [1, 4, 3, 2]

q.popfront(); // 返回 1 -> [4, 3, 2]

q.popmiddle(); // 返回 3 -> [4, 2]

q.popmiddle(); // 返回 4 -> [2]

q.popback(); // 返回 2 ->

q.popfront(); // 返回 -1 -> (隊列為空)

1 <= val <= 109

最多呼叫 1000 次 pushfront, pushmiddle, pushback, popfront, popmiddle 和 popback 。

方法1:

主要思路:

(1)使用deque 雙端佇列實現對儲存結構兩端的快速刪除和新增;

(2)為了處理能夠快速處理中間值,可以使用兩個雙端佇列分別儲存前半部分和後半部分的元素,這樣可以快速處理中間元素;

(3)每次的插入和刪除要保證元素前面部分的數量等於後面部分的數量,或等於後面部分的元素數量加1這兩種狀態;

class

frontmiddlebackqueue

void

pushfront

(int val)

}void

pushmiddle

(int val)

else

++size;

}void

pushback

(int val)

}int

popfront()

--size;

int res=front_nums.

front()

; front_nums.

pop_front()

;//調整兩部分之間的狀態

if(back_nums.

size()

>front_nums.

size()

)return res;

}int

popmiddle()

int res;

//一定是從前面部分的後端彈出

res=front_nums.

back()

; front_nums.

pop_back()

;//調整兩部分之間的狀態

if(back_nums.

size()

>front_nums.

size()

)--size;

return res;

}int

popback()

--size;

//處理最終的只有乙個元素的情形,因為該最後乙個元素一定是在前面部分儲存

if(size==0)

//其他的情形,從後半部分的後端彈出

int res=back_nums.

back()

; back_nums.

pop_back()

;//處理兩部分的狀態

if(front_nums.

size()

-back_nums.

size()

>1)

return res;}}

;/**

* your frontmiddlebackqueue object will be instantiated and called as such:

* frontmiddlebackqueue* obj = new frontmiddlebackqueue();

* obj->pushfront(val);

* obj->pushmiddle(val);

* obj->pushback(val);

* int param_4 = obj->popfront();

* int param_5 = obj->popmiddle();

* int param_6 = obj->popback();

*/

設計前中後佇列

1,感覺這東西主要看我對 vector的熟悉程度阿。畢竟用vector模擬 2,insert函式 insert a,b 在a位置之前插入值為b的元素.3,再就是計算中間pos的位置,主要是根據有個 1,2,3,5,6 你自己寫個真的就好想了 然後就是這個位置數,要 是這樣用的insert q.beg...

Leetcode 1670 設計前中後佇列

題意 請你設計乙個佇列,支援在前,中,後三個位置的push和pop操作。請你完成frontmiddleback類 請注意當有兩個中間位置的時候,選擇靠前面的位置進行操作。比方說 解題思路 使用雙端佇列進行模擬即可 class frontmiddlebackqueue void pushfront i...

java中的前 和後

直接po 和截圖 package com.test public class beforeandafterplus 執行結果如下 public static void main string args else 所以c最終是21 system.out.println c c int d 30 這裡是...