https://neoj.sprout.tw/problem/1234/
在 linked list 尾端新增值為 value 的節點。
void append(Node *&head, int value) {
Node *new_node = new Node;
new_node->value = value;
new_node->next = nullptr;
// TODO: 判斷 head 是否為 nullptr
if (head == nullptr) {
// ....
return;
}
Node *cur = new Node;
cur = head;
while (cur->next != nullptr) {
// 讓 cur 指向下一個節點
// ...
}
// 最後一個節點指向新結點
// ....
}
將值為 value 的節點插入 linked list 索引值為 index 的位置。
void insert(Node *&head, int index, int value) {
Node *new_node = new Node;
new_node->value = value;
new_node->next = nullptr;
// TODO: 如果 index 為 0
if (index == 0) {
// ...
return;
}
// TODO: 讓 cur 指向第 index-1 個節點
Node *cur = head;
for (int i = 0; i < index - 1; i++) {
// warning
if (...) {
cur = cur->next;
}
}
// 本題不需要下面這個判斷,但正常來說是必要的 !
if (cur == nullptr) {
delete new_node;
return;
}
// TODO: 接上新的節點
}
在 linked list 刪除值為 value 的節點
void deleteNode(Node *&head, int value) {
// 判斷 head 是否為 nullptr
if(head==nullptr){
return;
}
// 檢查 head 是否為被刪除的節點
if(head->value == value){
// ...
return;
}
// 找出 "要被刪除的節點" del 的 "前一個節點" pre
Node *pre = head;
while (pre->next != nullptr && pre->next->value != value) {
pre = pre->next;
}
// 刪除節點
if (pre->next != nullptr) {
// ....
}
}
印出 linked list 所有值,每印出一個值請換行,包含最後一個值也要換行!
void print(Node *head) {
Node *current = head;
while (current != nullptr) {
// TODO: 印出值並指向下一個節點
}
}
https://neoj.sprout.tw/problem/1111/
用C-Style 字串存取每張牌的資訊,並用 vector 把這些資訊存在一起。
(若會使用 string , 則不須使用 C-Style 字串)
用 std::sort() 對全部的牌由小到大排序。
在自定義的 compare function 裡,依照題目給的花色大小、數字大小做比較。
比較的優先級如下敘述
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int get_suit_rank(char c) {
// TODO: 自己定義各個花色的大小,並回傳
}
int get_card_value(string c) {
// TODO: 將卡牌的 number 由 string 回傳成 int
}
bool compare(string a, string b) {
// TODO: 判斷是否為 Joker
// Joker 最大,最先判斷是否有 Joker,若有,則直接回傳。Joker 的資訊是字串長度為 1
// ....
// 抓出字串的花色 suit
char a_suit = a[0];
char b_suit = b[0];
// TODO: 抓出字串的數字 number
string a_number = ...
string b_number = ...
// TODO: 比較數字大小
if (get_card_value(a_number) != get_card_value(b_number)) return ...
// TODO: 比較花色
if (get_suit_rank(a_suit) != get_suit_rank(b_suit)) return ...
return false;
}
int main() {
// 輸入卡牌
int number_of_cards;
cin >> number_of_cards;
vector<string> card(number_of_cards);
for (int i = 0; i < number_of_cards; i++) {
cin >> card[i];
}
// 排序
sort(card.begin(), card.end(), compare);
// TODO : 輸出
// ....
}
https://neoj.sprout.tw/problem/20/
團體數量
紀錄人與團體之間的關係 person_to_group
person_to_group
來記錄每個人所在的群組person_to_group
大小設置為 1000000(題目有提到人的編號為 0 ~ 999999)person_to_group
,使其記錄每個人對應的群組編號。主隊列 main_queue
如下所示:
主隊列中,團體排隊的順序分別為 5, 7, …, 1, 51, 93。
子隊列 group_queues
如下所示:
group_queues[5]
裡面有編號 12。
group_queues[7]
裡面有編號8, 10, …, 4, 13
記錄每個團體是否在主隊列中 in_main_queue
ENQUEUE X
person_to_group
取得編號為 x 的人所屬的團體new_queue
,把new_queue
加進 group_queues
,並更新他的person_to_group
、in_main_queue
main_queue
,並更新相關變數DEQUEUE X
main_queue
取得最前面的團體group_queue
是否為空
in_main_queue
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
int main() {
int t;
cin >> t;
for (int test_case = 1; test_case <= t; test_case++) {
cout << "Line #" << test_case << endl;
int n;
cin >> n;
vector<int> person_to_group(1000000, -1);
for (int i = 0; i < n; i++) {
// TODO: 更新人的所屬團體
// ...
}
queue<int> main_queue;
vector<queue<int>> group_queues(n);
vector<bool> in_main_queue(n, false);
int m;
cin >> m;
for (int i = 0; i < m; i++) {
string command;
cin >> command;
if (command == "ENQUEUE") {
int x;
cin >> x;
int group = person_to_group[x];
// 如果這個人單獨一組,do something......
if (group == -1) {
// ...
}
// 如果不在主隊列之中
if (!in_main_queue[group]) {
// ...
}
group_queues[group].push(x);
}
else if (command == "DEQUEUE") {
// 用`main_queue`取得最前面的團體
// ...
// 取出該團體子隊列中的最前面的一個人
// ...
// TODO: 如果子隊列內已經沒人
if (group_queues[front_group].empty()) {
// ...
}
cout << person << endl;
}
}
}
return 0;
}